Ковариантный тип Т встречается в контравариантном положении
Я знаю, что этот вопрос задавался ранее, но либо ответы не относятся к этому делу, либо я не понимаю их.
По сути, почему не работает следующий (простой пример, воссоздающий мою проблему)?
class Test[+T] {
var list: List[T] = _
}
Проблема, с которой я столкнулся, заключается в том, что у меня есть объект, который я хочу передать в экземпляре Test[Nothing] (пустой Test), и это не сработает, если я не создам тестовый вариант в T.
1 ответ
Создание теста ковариант в T
Значит это Test[A]
это подтип Test[Any]
для любого A
, Итак, давайте создадим Test
:
val test_string = new Test[String]
Теперь у нас есть Test[String]
и содержал list
это тип List[String]
,
поскольку Test[String]
это подтип Test[Any]
должно быть разрешено следующее:
val test_any : Test[Any] = test_string
И теперь у нас есть Test[Any]
, и поэтому test_any.list
это тип List[Any]
, что означает следующее должно быть действительным:
test_any.list = List[Any]()
Это означает, что мы только что назначили List[Any]
к элементу списка test_strings, который не должен быть разрешен, так как это должно быть List[String]
не List[Any]
, Это также означает, что к списку можно добавить что угодно, так как это тип List[Any]
,