我想我已经理解了协方差和合作的原则。然而,似乎我仍然遇到使用它的问题。 这是一个例子:我想编写一个带有一组固定值的简单通用不可变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]
答案 0 :(得分:1)
B
内的Container
类型在Container
的类型中不可见。因此,对于add
,我们所知道的是它要求其参数属于某种类型B
,可能比A
更具体,但我们不知道B
是的。因此,调用add
是不可能的(这就是错误消息如此奇怪的原因)。
您要对type B
做什么?