Ковариантный тип Т встречается в контравариантном положении

Я знаю, что этот вопрос задавался ранее, но либо ответы не относятся к этому делу, либо я не понимаю их.

По сути, почему не работает следующий (простой пример, воссоздающий мою проблему)?

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],

Другие вопросы по тегам