下界上的Scala类型方差



在Scala编程第二版第19.5节中

class Queue[+T] (private val leading: List[T],
      private val trailing: List[T] ) {
    def enqueue[U >: T](x: U) =
      new Queue[U](leading, x :: trailing) // ...
}

T应该在

下面的负位置结束
def enqueue[U- >: T-](x: U-) =
          new Queue[U](leading, x :: trailing) // ...

但是书上提到有2次抛硬币

从技术上讲,发生的是下界翻转。类型参数U为负值(1次翻转),而下界(>:T)为正值(2次翻转)。

这里怎么出现2次抛硬币?

enqueue中,T 不是类型参数,而是对外部上下文的类型成员的引用。因此,说"T应该以负的位置结束"是不正确的。

也许你可以把对T的引用看作是U的下界,作为"产生T的方法调用",只是它是一个"类型调用",所以T有点像"返回类型"或协变位置。

下面这句话很重要:

直观地说,如果T是比预期更具体的类型(例如,Apple而不是Fruit),调用append仍然有效,因为U (Fruit)仍然是T (Apple)的超类型。

最新更新