Estoy estudiando el código fuente de las clases de colección de Scala 2.8. Tengo preguntas sobre la jerarquía de scala.collection.Traversable
. Mira las siguientes declaraciones:Parámetros de herencia y tipo de Traversable
package scala.collection
trait Traversable[+A]
extends TraversableLike[A, Traversable[A]]
with GenericTraversableTemplate[A, Traversable]
trait TraversableLike[+A, +Repr]
extends HasNewBuilder[A, Repr]
with TraversableOnce[A]
package scala.collection.generic
trait HasNewBuilder[+A, +Repr]
trait GenericTraversableTemplate[+A, +CC[X] <: Traversable[X]]
extends HasNewBuilder[A, CC[A] @uncheckedVariance]
Pregunta: ¿Por qué se extienden Traversable
GenericTraversableTemplate
con parámetros de tipo [A, Traversable]
- por qué no [A, Traversable[A]]
? Probé un poco de experimentación con un pequeño programa con la misma estructura y recibido un mensaje de error extraño cuando traté de cambiarlo a Traversable[A]
:
error: Traversable[A] takes no type parameters, expected: one
supongo que el uso de la @uncheckedVariance
anotación en GenericTraversableTemplate
también tiene que ver con ¿esta? (Parece una clase de truco potencialmente inseguro para obligar a las cosas a funcionar ...).
edición - encontró algunas respuestas útiles acerca de la anotación en this question (es porque GenericTraversableTemplate
se utiliza para las colecciones tanto mutables e inmutables que tienen diferente varianza).
Pregunta: Cuando nos fijamos en la jerarquía, se ve que Traversable
hereda HasNewBuilder
dos veces (una vía TraversableLike
y una vez a través de GenericTraversableTemplate
), pero con un poco diferentes parámetros de tipo. Como funciona esto exactamente? ¿Por qué los diferentes parámetros de tipo no causan un error?
¡Gracias por tomarse el tiempo para responder a esto tan claramente! Había escuchado sobre "tipos" antes pero realmente no entendía lo que significaban hasta ahora. – Jesper