2011-03-15 10 views
6

¿Cómo puede Seq [+ A] ser covariante en A si A se produce en la posición contravariant:¿Cómo puede Seq [+ A] ser covariante en A?

def :+ (elem: A) : Seq[A] ?

Según entiendo, un tipo de argumento método es una posición contravariant. Qué me estoy perdiendo ?

Respuesta

10

Ese es el caso de uso firma. No es una firma real, solo lo que generalmente verá en el caso de uso común.

La firma real es:

def :+ [B >: A, That] (elem : B)(implicit bf : CanBuildFrom[Seq[A], B, That]) : That 

cual, como se ve, ni siquiera garantiza un retorno Seq, mucho menos A.

+5

Para seguir con lo que dijo Daniel, los métodos de recolección devuelven _una nueva colección_ y estos pueden tener un tipo ampliado. Entonces, sí, un 'Seq [A]' solo puede contener 'A's, pero su nuevo' Seq' podría tener su tipo ampliado para que pueda contener algo más que 'A'. –

+3

Es una pena que la firma del caso de uso use ': + (elem: A): Seq [A]' en lugar de ': + [B>: A] (elem: B): Seq [B]' aunque . –

+0

@Kris Estoy de acuerdo: ': + [B>: A] (elem: B): Seq [B]' es mucho más intuitivo. ¿Podemos pedirle a los chicos de Scala que cambien los documentos de API? – Michael

Cuestiones relacionadas