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

时间:2012-05-12 04:31:07

标签: scala covariance lower-bound

我正在阅读本页http://www.scala-lang.org/node/137,我也理解协方差是什么和下界,但是这条线不清楚:

  

不幸的是,这个程序没有编译,因为协方差   只有在仅使用类型变量时才可以使用注释   协变立场。由于类型变量T显示为参数类型   方法前置,这个规则被打破了。

为什么elem必须是T的超类型的实例,如果ListNode已经是协变的,为什么elem无法预先添加到当前列表中。

1 个答案:

答案 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)
}

由于FooT的协变,因此这是有效的(简单的向上转发,因为Foo[Sub]Foo[Super]):

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

据我们所知,现在fooFoo[Super]一样bar,但其bar方法不起作用,因为Sub实施需要foo.bar(sup) // would cause error!

{{1}}