10

Dlaczego wszystkie klasy Scala dziedziczą po ScalaObject, chociaż ta cecha jest całkowicie pusta i nie ma funkcji (widocznej?) W porównaniu do AnyRef, która definiuje dodatkowe metody?Dlaczego istnieje `ScalaObject`?

Czy to nie spowolni wywołań metod takich jak equals() lub hashCode(), ponieważ będzie musiał wziąć inną klasę pod uwagę (co może zastąpić metody)?

Czy nie można złożyć AnyRef i ScalaObject w jedną klasę?

UPDATE: ScalaObject was eradicated z nowej wersji 2.10 Scala.

Odpowiedz

11

ScalaObject wstawia $tag metody, które, zgodnie z komentarzem w library source code for 2.7 „jest potrzebne do optymalizacji wzór pasujący wyrażeń, które odpowiadają na konstruktorów klas przypadków.” Ponieważ nazwa zaczyna się od $, należy oczywiście uznać ją za "ukrytą" dla programistów aplikacji. W Scala 2.8 jest całkowicie pusta, więc domyślam się, że jest tam kompatybilna wstecz.

+0

Dlaczego ta metoda $ tag nie jest wstawiona do AnyRef? – soc

+0

Zgodny wstecz, jak sądzę. (Rozszerzyłem moją odpowiedź po pobraniu i przeczytaniu kodu źródłowego 2.8.) –

+0

Przeszedłem przez kod kompilatora i jest jakiś kod do obsługi go w specjalny sposób (plik 'Global.scala'), ale nie ma wyjaśnienia, dlaczego tak jest. –

4

To także przydatny chwyt do analiz statycznych. Na przykład, wyobraź sobie, że masz narzędzie, które może przeszukiwać bazę kodu (skompilowaną lub nie) i powiedzieć, że możesz poprawić pewne parametry spójności/sprzężenia/równowagi warstw/co-masz-ciebie przez wyodrębnienie cechy z tych klasy i utworzyć niejawne konwersje dla tych klas. To narzędzie rozsądnie raportowałoby tylko o cechach, które mogłyby z zyskiem wyodrębnić się z klas dziedziczących ScalaObject, a jednocześnie raportując opłacalne niejawne konwersje z dowolnej klasy Java. To samo narzędzie będzie raportować o wszystkich możliwych "zerowych" zwrotach z podklas ScalaObject (gdzie opcja lub podobne jest zwykle lepszym wyborem), ignorując null zwraca z klas Java.

7

Przekazywanie metod nie łańcuchuje struktury dziedziczenia klas w poszukiwaniu implementacji. Kompilator konstruuje tabelę ekspedycji metod netto dla każdej klasy, która odzwierciedla jej linearyzację netto/dziedziczoną linię metod. Jest to jedna z zalet statycznego rozwiązywania wszystkich pism.

Powiązane problemy