Scala较低的类型边界和协方差

lok*_*oki 5 scala covariance lower-bound

我正在阅读这个页面http://www.scala-lang.org/node/137,我也明白协方差是什么和下限,但不清楚的是这一行:

不幸的是,这个程序不能编译,因为只有在变量位置使用类型变量时才能进行协方差注释.由于类型变量T作为方法前置的参数类型出现,因此该规则被破坏.

为什么elem必须是超类型的实例T,如果ListNode已经是协变的,为什么elem不能在当前列表前加上.

Lui*_*hys 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
Run Code Online (Sandbox Code Playgroud)

想象一下允许以下行为:

// invalid code
class Foo[+T] {
  def bar(x: T) = println(x)
}
Run Code Online (Sandbox Code Playgroud)

由于Foo是 上的协变T,因此这是有效的(一个简单的向上转换,因为 aFoo[Sub]是 a Foo[Super]):

val foo : Foo[Super] = new Foo[Sub] {
  override def bar(x: Sub) = x.subMethod
}
Run Code Online (Sandbox Code Playgroud)

foo据我们所知,Now与Foo[Super]其他方法一样,但它的bar方法不起作用,因为bar实现需要Sub

foo.bar(sup) // would cause error!
Run Code Online (Sandbox Code Playgroud)