2009-06-23 79 views
29

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

在我看到的所有东西中,它们看起来都很相当。

几个参考。 Martin Odersky mentions them;谷歌的top hit for my question

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

+0

imho,fotNelton似乎让其他人省略了一些相关的附加内容,这对了解更多内容会很有趣。这将是有趣的后半部分的报价解释更清楚... – ib84 2013-04-24 17:54:24

回答

13

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

(由 五十岚和Viroli在ECOOP论文中描述)的原始Java通配符类型确实为生存 类型只是速记。我被告知,并且我已阅读Fool '05关于Wild FJ的论文 通配符的最终版本与 存在类型有一些细微的差异。我不知道究竟是什么意思(他们的 形式主义与经典存在主义类型相去甚远,能够找出差异),但也许仔细阅读FJ论文将揭示它的一些细节。

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

6

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

+0

我已经添加Martin Odersky的评论给我原来的问题。阅读他对Bill Venners的回应,感觉存在型不等于通配符。当然,我确信我读了一段时间,基本上夸大了Scala *不*具有通配符类型(正如它最初没有的那样)是一件好事。 – 2009-06-23 15:31:56

+0

有人向我指出,这可能是夸大事实,斯卡拉不具有*原始*类型 – 2009-06-24 07:04:32

6

他们都非常相似,但Scala的存在类型应该是更强大。例如,Scala的存在类型可以是上限和下限,而Java的通配符只能上限绑定。

例如,在Scala中:

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

foo的需要参数的列表,其具有下界Int的。

4

的一种方式由马丁·奥德斯基(其余可以发现here)更详细的解答:

斯卡拉需要生存类型基本上是三件事情。第一个 是我们需要对Java的通配符有所了解,存在类型是我们对它们的意义。第二个是我们 需要对Java的原始类型有所了解,因为它们也是 仍然在库中的未加密类型。如果你得到一个Java raw 类型,比如java.util.List,它就是一个不知道 元素类型的列表。这也可以在Scala中用一个存在的类型 来表示。最后,我们需要存在类型来解释在Scala高层虚拟机上运行 的方法。 Scala使用泛型的擦除模型 ,就像Java一样,所以我们在程序运行时不再看到类型参数 。我们必须进行擦除,因为我们需要 与Java进行互操作。但是当我们做反思 或想要表达VM中发生的事情时会发生什么?我们需要能够通过 来表示JVM使用我们在Scala中使用的类型所做的工作,而存储类型让我们可以做到这一点。他们让你谈谈你不知道这些类型的某些方面的类型。

0

List[_]符号(其作为其他的答案指出的是更强大的模拟Java的List[?])是Scala一种存在类型的more general notion的简并情况。

相关问题