首页 文章

Scala下限类型和协方差

提问于
浏览
5

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

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

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

1 回答

  • 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
    }
    

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

    foo.bar(sup) // would cause error!
    

相关问题