我正在读这个页面http://www.scala-lang.org/node/137,我理解协方差和下界也是什么,但是不清楚的是这一行:
不幸的是,这个程序不能编译,因为只有在变量位置使用类型变量时才能进行协方差注释 . 由于类型变量T作为方法前置的参数类型出现,因此该规则被破坏 .
为什么 elem
必须是 T
的超类型的实例,如果 ListNode
已经是协变的,为什么 elem
不能被添加到当前列表中 .
我正在读这个页面http://www.scala-lang.org/node/137,我理解协方差和下界也是什么,但是不清楚的是这一行:
不幸的是,这个程序不能编译,因为只有在变量位置使用类型变量时才能进行协方差注释 . 由于类型变量T作为方法前置的参数类型出现,因此该规则被破坏 .
为什么 elem
必须是 T
的超类型的实例,如果 ListNode
已经是协变的,为什么 elem
不能被添加到当前列表中 .
1 回答
想象一下,允许以下内容:
由于
Foo
在T
上是协变的,因此这是有效的(简单的向上转换,因为Foo[Sub]
是Foo[Super]
):现在
foo
,据我们所知,Foo[Super]
就像其他任何一样,但它的bar
方法不起作用,因为bar
实现需要Sub
: