vectores matriz gram covariantes contravariantes scala

scala - covariantes - matriz de gram



Tipo covariante T se produce en posiciĆ³n contravariante. (1)

Sé que esta pregunta se ha hecho antes, pero o bien las respuestas no se aplican a este caso o no las entiendo.

Básicamente, ¿por qué no funciona el siguiente (ejemplo simple que recrea mi problema)?

class Test[+T] { var list: List[T] = _ }

El problema que tengo es que tengo un objeto, donde quiero pasar en una instancia de Prueba [Nada] (la Prueba vacía), y esto no funciona a menos que haga la Prueba variante en T.


Hacer covariante de prueba en T significa que Test[A] es un subtipo de Test[Any] para cualquier A Así que vamos a crear una Test :

val test_string = new Test[String]

Ahora tenemos una Test[String] y la list contenida es tipo List[String] .

Dado que Test[String] es un subtipo de Test[Any] , se debe permitir lo siguiente:

val test_any : Test[Any] = test_string

Y ahora, tenemos un Test[Any] , y por test_any.list tanto test_any.list es de tipo List[Any] , lo que significa que lo siguiente debería ser válido:

test_any.list = List[Any]()

Lo que significa que simplemente asignamos un miembro de la List[Any] a la lista de pruebas, que no debería estar permitido, ya que se supone que es una List[String] , no una List[Any] . También significa que podría anteponer cualquier cosa a la lista, ya que es de tipo List[Any] .