首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >*清单中的方法-逆变参数类型

*清单中的方法-逆变参数类型
EN

Stack Overflow用户
提问于 2013-02-15 11:57:29
回答 2查看 98关注 0票数 0

一个简单的问题。类不可变::的方法List定义为:

密封抽象类List+A ..。 编号::B >: A:ListB

假设我有:

代码语言:javascript
复制
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,那么为什么编译器不抛出错误呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-15 13:02:08

排在队伍里

代码语言:javascript
复制
new Mango :: d

您希望编译器进行推理:"new MangoMango类型,dList[Fruit]类型,所以List[Fruit].::(Mango)需要进行类型检查,而它不需要。“在这种情况下,这确实是一个错误。

但事实上,原因不同:“我需要new Mango :: d来打字,所以new Mango必须有某种类型的B,比如B :> Fruit。有这样的B吗?是的,B = Fruit。”所以没有错误。

票数 3
EN

Stack Overflow用户

发布于 2013-02-15 12:13:10

您仍然可以将Mango添加到d中,即使List是不变的,因为Mango仍然是一个Fruit。考虑一下简单的旧java列表:

代码语言:javascript
复制
val d = new java.util.ArrayList[Fruit]
d.add(new Mango)

因此,逆方差并不限制您添加子类型的能力--它使您能够添加超级类型,并从中获得编译器选中的列表类型:

代码语言:javascript
复制
val d: List[Fruit] = Nil
val a: List[Plant] = new Carrot :: d
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14894239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档