我之前已经问过这个问题,但答案不适用于这种情况,或者我不理解。
基本上,为什么以下(重新创建我的问题的简单示例)不起作用?
class Test[+T] {
var list: List[T] = _
}
我遇到的问题是我有一个对象,我希望传递一个Test [Nothing]的实例(空测试),除非我在T中使用Test co-variant,否则这不起作用。
答案 0 :(得分:26)
在T
中设置测试协变意味着Test[A]
是任何Test[Any]
的{{1}}子类型。因此,我们创建一个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_strings列表成员分配了test_any.list = List[Any]()
,这不应该被允许,因为它应该是List[Any]
,而不是List[String]
。这也意味着您可以在列表中添加任何内容,因为它是List[Any]
类型。