Tiene razón; el new
no es obligatorio. Podrían haber definido el método de instancia List#::
como esto tan bien:
def ::[U >: T](x: U): List[U] = scala.::(x, this)
(Tenga en cuenta que tenemos:
type :: = collection.immutable.::
val :: = collection.immutable.::
definida en el objeto scala
paquete, la primera es por qué sus new scala.::(x, this)
obras, y el segundo es por qué mi scala.::(x, this)
funciona.)
The form the library uses llama al constructor directamente, como lo hace el tuyo. La alternativa llama al método apply
del objeto complementario sintético generado para la clase de caso ::
, que simplemente llama al constructor de todos modos. ¿Tal vez llamar al constructor se consideró más claro o más eficiente? (. Las ganancias de eficiencia deben estar cerca de nada, sin embargo, ya que si el compilador no coloca en línea de la llamada a apply
, la JVM) supongo que la forma más compacto:
def ::[U >: T](x: U) = ::(x, this)
podrían confundirse con algún loco (es decir, imposible) tipo de invocación recursiva, y en cualquier caso desdibuja la distinción entre la clase llamada ::
y el método List
llamado ::
, que el Prof. Odersky se esfuerza por mantener separado para maximizar la comprensión del lector.
Espero que esto ayude.
final solo significa que la clase no se puede extender, no tiene nada que ver con la creación de instancias :-). La clase de caso es básicamente una clase que se puede comparar en un bloque de "coincidencia". – aishwarya