一个简单的问题。类不可变::的方法List定义为:
密封抽象类List+A ..。 编号::B >: A:ListB
假设我有:
class Fruit
class Mango extends Fruit
scala> val d:List[Fruit] = List.empty[Fruit]
d: List[Fruit] = List()
scala> new Mango :: d
res5: List[Fruit] = List(Mango@272d6774)现在我在这里很困惑。根据::声明,参数类型应该是相反的。也就是说,在这种情况下,>: Fruit的任何类(我理解为什么它是那样的)。但是我不明白的是,Mango <: Fruit,那么为什么编译器不抛出错误呢?
发布于 2013-02-15 13:02:08
排在队伍里
new Mango :: d您希望编译器进行推理:"new Mango有Mango类型,d有List[Fruit]类型,所以List[Fruit].::(Mango)需要进行类型检查,而它不需要。“在这种情况下,这确实是一个错误。
但事实上,原因不同:“我需要new Mango :: d来打字,所以new Mango必须有某种类型的B,比如B :> Fruit。有这样的B吗?是的,B = Fruit。”所以没有错误。
发布于 2013-02-15 12:13:10
您仍然可以将Mango添加到d中,即使List是不变的,因为Mango仍然是一个Fruit。考虑一下简单的旧java列表:
val d = new java.util.ArrayList[Fruit]
d.add(new Mango)因此,逆方差并不限制您添加子类型的能力--它使您能够添加超级类型,并从中获得编译器选中的列表类型:
val d: List[Fruit] = Nil
val a: List[Plant] = new Carrot :: dhttps://stackoverflow.com/questions/14894239
复制相似问题