Scala泛型类型和协方差/逆变

时间:2013-11-16 09:09:01

标签: scala generics covariance

我想我已经理解了协方差和合作的原则。然而,似乎我仍然遇到使用它的问题。 这是一个例子:我想编写一个带有一组固定值的简单通用不可变Container。 所以我创建了一个基本的特质

trait Container[+A] {

 type B <: A

 def add(elem: B): Container[A]
} 

然后我开始编写具体的类来表示具有不同数量值的不同容器,例如空容器和带有一个元素的容器

class Container0[+A] extends Container[A] {

  def add(elem: B): Container[A] = new Container1[A](elem)
}  


class Container1[+A](elem0: A) extends Container[A] {

 def add(elem: B): Container[A] = new Container2[A](elem0, elem)
}

这个编译很好,但是当我尝试使用它时:

var t: Container[AnyVal] = new Container0[AnyVal]
t = t.add(5)

我收到以下错误:

type mismatch; found : Int(5) required: _3.B where val _3: Container[AnyVal]

1 个答案:

答案 0 :(得分:1)

B内的Container类型在Container的类型中不可见。因此,对于add,我们所知道的是它要求其参数属于某种类型B,可能比A更具体,但我们不知道B是的。因此,调用add是不可能的(这就是错误消息如此奇怪的原因)。

您要对type B做什么?