我正在阅读本页http://www.scala-lang.org/node/137,我也理解协方差是什么和下界,但是这条线不清楚:
不幸的是,这个程序没有编译,因为协方差 只有在仅使用类型变量时才可以使用注释 协变立场。由于类型变量T显示为参数类型 方法前置,这个规则被打破了。
为什么elem
必须是T
的超类型的实例,如果ListNode
已经是协变的,为什么elem
无法预先添加到当前列表中。
答案 0 :(得分:2)
class Super {override def toString = "Super"}
class Sub extends Super {override def toString = "Sub"; def subMethod {} }
val sup = new Super
val sub = new Sub
想象一下,允许以下内容:
// invalid code
class Foo[+T] {
def bar(x: T) = println(x)
}
由于Foo
是T
的协变,因此这是有效的(简单的向上转发,因为Foo[Sub]
是Foo[Super]
):
val foo : Foo[Super] = new Foo[Sub] {
override def bar(x: Sub) = x.subMethod
}
据我们所知,现在foo
与Foo[Super]
一样bar
,但其bar
方法不起作用,因为Sub
实施需要foo.bar(sup) // would cause error!
:
{{1}}