Scala的存在类型,并通过例如Java的通配符之间的区别?(Difference between

2019-06-23 22:25发布

略高于堆栈溢出的问题更具体什么是存在的类型? 是什么Scala的存在类型和Java的通配符之间的区别,prefereably一些说明性的例子吗?

在一切到目前为止,我所看到的,他们似乎是相当相当的。

几个引用。 马丁·奥德斯基提到他们 ; 谷歌的顶部打我的问题

MO:原通配符设计......是由生存型的启发。 事实上原纸曾在生存类型的编码。 但后来当实际最终设计在Java中走了出来,这方面迷路了一点点

Answer 1:

这是马丁·奥德斯基对斯卡拉用户邮件列表的答案:

原始的Java通配符类型(如在由五十岚和Viroli的ECOOP论文中描述)确实存在对刚刚类型简写。 有人告诉我,我已经在FOOL '05纸野生FJ读取通配符的最终版本有存在的各类一些细微的差别。 我不知道到底在什么意义(形式主义太远从古典存在类型去除,以能够精确定位的差异),但也许是野生FJ纸仔细阅读有助于了解一些关于它的光。

因此,它似乎是斯卡拉存在类型和Java通配符样,相当于



Answer 2:

他们应该是相等的,因为他们的主要目的是与Java的通配符进行交互。



Answer 3:

他们都非常相似,但Scala的存在类型应该是更强大。 例如,Scala的存在类型可以是在上下两个界而Java的通配符只能上部接合。

例如,在斯卡拉:

scala> def foo(x : List[_ >: Int]) = x
foo: (x: List[_ >: Int])List[Any]

foo的需要参数列表,它的下限为int。



Answer 4:

一种方法由Martin Odersky的(其余的都可以找到更详细的解答这里 ):

斯卡拉需要存在类型基本上是三件事情。 第一,我们需要做Java的通配符某种意义上说,和存在的类型是我们让他们的感觉。 第二个是,我们需要让Java的原始类型的一些感觉,因为他们也还是在图书馆,ungenerified类型。 如果你得到一个Java原始类型,如java.util.List的是一个列表,你不知道的元素类型。 这也可以在Scala中通过一个存在类型表示。 最后,我们需要生存的类型,以此来解释在VM高电平斯卡拉的推移。 斯卡拉使用泛型的擦除模型,就像Java,所以我们不再看到类型参数程序运行时。 我们有因为我们需要与Java互操作做删除。 但是,当我们做反射或想表达什么在VM上消失,那会发生什么? 我们需要能够代表JVM使用确实是我们在斯卡拉的类型和存在的类型让我们做到这一点。 他们让你谈论类型的,你不知道这些类型的某些方面。



Answer 5:

List[_]符号(其中为其他的答案指出的是更强大的模拟Java的List[?] )是的退化情况更普遍的概念在斯卡拉的生存型。



文章来源: Difference between Scala's existential types and Java's wildcard by example?