Scala的存在类型和Java的通配符之间的区别是什么?

时间:2009-06-23 07:08:46

标签: java scala type-systems bounded-wildcard existential-type

比Stack Overflow问题 What is an existential type? 更具体一点,Scala的存在类型和Java的通配符之间有什么区别,优先考虑一些说明性的例子?

到目前为止我所看到的一切,似乎都相当。

一些参考文献。马丁奥德斯基mentions them; Google的top hit for my question

  

MO:原始的通配符设计......受到存在主义类型的启发。实际上,原始论文在存在类型中具有编码。但是当实际的最终设计出现在Java中时,这种连接有点丢失

5 个答案:

答案 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的退化情形阶。