20

我知道以前有人问过这个问题,但答案要么不适用于这种情况,要么我不明白。

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

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

我遇到的问题是我有一个对象,我想在其中传递Test[Nothing](空Test)的一个实例,除非我TestT.

4

1 回答 1

27

使测试协变T意味着 thatTest[A]Test[Any]any的子类型A。所以让我们创建一个Test

val test_string = new Test[String]

现在我们有了 aTest[String]并且包含list的​​是 type List[String]

由于Test[String]是 的子类型Test[Any],因此应允许以下内容:

val test_any : Test[Any] = test_string

现在,我们有一个Test[Any],因此test_any.list是 type List[Any],这意味着以下内容应该是有效的:

test_any.list = List[Any]()

这意味着我们只是将 a 分配List[Any]给 test_strings 列表成员,这是不允许的,因为它应该是 a List[String],而不是 a List[Any]。这也意味着您可以在列表中添加任何内容,因为它是 type List[Any]

于 2013-01-29T14:23:18.057 回答