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

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

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

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

Проблема, с которой я сталкиваюсь, заключается в том, что у меня есть объект, в котором я хочу передать экземпляр Test [Nothing] (пустой тест), и это не сработает, если я не сделаю тестовый ко-вариант в 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].