比Stack Overflow问题 What is an existential type? 更具体一点,Scala的存在类型和Java的通配符之间有什么区别,优先考虑一些说明性的例子?
到目前为止我所看到的一切,似乎都相当。
一些参考文献。马丁奥德斯基mentions them; Google的top hit for my question :
MO:原始的通配符设计......受到存在主义类型的启发。实际上,原始论文在存在类型中具有编码。但是当实际的最终设计出现在Java中时,这种连接有点丢失
答案 0 :(得分:14)
这是Martin Odersky对Scala用户邮件列表的回答:
原始Java通配符类型(如ECOOP论文中所述) Igarashi和Viroli)确实只是存在主义的缩写 类型。有人告诉我,我已经阅读了FOOL '05关于Wild FJ的论文 通配符的最终版本有一些细微的差别 存在类型。我不知道究竟是什么意思(他们的 形式主义与古典存在主义类型相去甚远 能够查明差异),但也许仔细阅读Wild FJ论文将对此有所了解。
所以看起来Scala存在类型和Java通配符似乎是等价的
答案 1 :(得分:6)
它们应该是等价的,因为它们的主要目的是与Java的通配符进行交互。
答案 2 :(得分:5)
它们非常相似,但Scala的存在类型应该更强大。例如,Scala的存在类型可以是上限和下限,而Java的通配符只能是上限。
例如,在Scala中:
scala> def foo(x : List[_ >: Int]) = x
foo: (x: List[_ >: Int])List[Any]
foo获取具有Int下限的参数列表。
答案 3 :(得分:5)
Martin Odersky的更详细的答案(其余的可以找到here):
Scala基本上需要三种存在类型。首先 是我们需要了解Java的通配符,以及 存在类型是我们对它们的意义。第二是我们 需要了解Java的原始类型,因为它们也是 还是在图书馆里,那些不合格的类型。如果你得到Java raw 类型,例如java.util.List,它是一个你不知道的列表 元素类型。这也可以通过存在主义在Scala中表示 类型。最后,我们需要存在类型作为解释内容的方法 在Scala的高级VM中。 Scala使用擦除模型 泛型,就像Java一样,所以我们没有看到类型参数 当程序运行时。因为我们需要,我们必须擦除 与Java互操作。但是当我们做反思时会发生什么 或者想表达虚拟机中的内容?我们需要能够 表示JVM使用我们在Scala中的类型所做的事情,以及 存在主义类型让我们这样做。他们让你谈谈那里的类型 你不知道那些类型的某些方面。
答案 4 :(得分:0)
List[_]
符号(正如其他答案所指出的那样是对Java List[?]
更强大的类比)是存在类型more general notion的退化情形阶。