Sei corretto; il new
non è obbligatorio. Avrebbero potuto definito il metodo di istanza List#::
come questo altrettanto bene:
def ::[U >: T](x: U): List[U] = scala.::(x, this)
(Si noti che abbiamo:
type :: = collection.immutable.::
val :: = collection.immutable.::
definito nell'oggetto scala
pacchetto: il primo è il motivo per cui i tuoi new scala.::(x, this)
opere, e il secondo è il motivo per cui il mio scala.::(x, this)
funziona.)
The form the library uses chiama direttamente il costruttore, come fa il vostro. L'alternativa chiama il metodo apply
dell'oggetto companion sintetico generato per la classe di case ::
, che chiama comunque il costruttore. Forse chiamare il costruttore è stato ritenuto più chiaro o più efficiente? (. Gli incrementi di efficienza dovrebbe essere vicino a niente, però, dato che se il compilatore non inline la chiamata alla apply
, la JVM) suppongo la forma più compatta:
def ::[U >: T](x: U) = ::(x, this)
potrebbe essere scambiato per un po 'strambo (cioè, impossibile) tipo di invocazione ricorsiva, e in ogni caso offusca la distinzione tra la classe chiamata ::
e il metodo chiamato ::
, che il Prof. Odersky si impegna a tenere separati per massimizzare la comprensione del lettore.
Spero che questo aiuti.
final significa solo che la classe non può essere estesa, non ha nulla a che fare con la creazione di istanze :-). La classe Case è fondamentalmente una classe che può essere confrontata in un blocco "match case". – aishwarya