【发布时间】:2011-04-11 00:38:08
【问题描述】:
鉴于以下情况:
trait Fruit
class Apple extends Fruit
class Orange extends Fruit
case class Crate[T](value:T)
def p(c:Crate[Fruit]) { }
val cra = Crate(new Apple)
val cro = Crate(new Orange)
由于 Crate 是不变的,我无法执行以下操作(如预期的那样):
scala> val fruit:Crate[Fruit] = cra
<console>:10: error: type mismatch;
found : Crate[Apple]
required: Crate[Fruit]
val fruit:Crate[Fruit] = cra
^
scala> val fruit:Crate[Fruit] = cro
<console>:10: error: type mismatch;
found : Crate[Orange]
required: Crate[Fruit]
val fruit:Crate[Fruit] = cro
scala> p(cra)
<console>:12: error: type mismatch;
found : Crate[Apple]
required: Crate[Fruit]
p(cra)
^
scala> p(cro)
<console>:12: error: type mismatch;
found : Crate[Orange]
required: Crate[Fruit]
p(cro)
但是当 Crate 不是协变的时,为什么我可以用这些调用方法 p? :
scala> p(Crate(new Apple))
Crate(line2$object$$iw$$iw$Apple@35427e6e)
scala> p(Crate(new Orange))
Crate(line3$object$$iw$$iw$Orange@33dfeb30)
我是否遗漏了一些基本的方差原则?
【问题讨论】: