Masz rację; new
nie jest obowiązkowe. Mogli zdefiniowano metodę instancji List#::
jak to równie dobrze:
def ::[U >: T](x: U): List[U] = scala.::(x, this)
(Zauważ, że mamy:
type :: = collection.immutable.::
val :: = collection.immutable.::
zdefiniowane w obiekcie scala
pakietu; pierwsza to dlaczego twoje prace new scala.::(x, this)
i po drugie dlatego mój scala.::(x, this)
działa.)
The form the library uses dzwoni do konstruktora bezpośrednio, tak jak twój. Alternatywa wywołuje metodę apply
syntetycznego obiektu towarzyszącego wygenerowanego dla klasy przypadku ::
, która po prostu wywołuje konstruktor mimo to. Być może dzwonienie do konstruktora było uważane za wyraźniejsze lub bardziej wydajne? (. Przyrost wydajności powinna być zbliżona do zera, chociaż, ponieważ jeśli kompilator nie inline wywołanie apply
, JVM będzie) Przypuszczam, że najbardziej kompaktową formę:
def ::[U >: T](x: U) = ::(x, this)
mógłby być wzięty za jakiś głupi (tj. niemożliwy) rodzaj rekursywnej inwokacji, a w każdym razie zaciera rozróżnienie między klasą o nazwie ::
a metodą ::
, którą Prof. Odersky dokłada starań, aby zachować odrębność w celu zmaksymalizowania zrozumienia czytnika.
Mam nadzieję, że to pomoże.
Finał oznacza, że klasa nie może być rozszerzona, nie ma nic wspólnego z tworzeniem instancji :-). Klasa case to w zasadzie klasa, którą można porównać w bloku "match case". – aishwarya