协变型T出现在逆变位置

时间:2013-01-29 14:07:04

标签: scala

我之前已经问过这个问题,但答案不适用于这种情况,或者我不理解。

基本上,为什么以下(重新创建我的问题的简单示例)不起作用?

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

我遇到的问题是我有一个对象,我希望传递一个Test [Nothing]的实例(空测试),除非我在T中使用Test co-variant,否则这不起作用。

1 个答案:

答案 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]类型。