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

oxb*_*kes 30 java type-systems scala existential-type bounded-wildcard

比Stack Overflow问题更具体一点什么是存在类型?,Scala的存在类型和Java的通配符之间有什么区别,特别是有一些说明性的例子?

在迄今为止我见过的所有内容中,它们似乎都相当.

一些参考文献.马丁奥德斯基提到了他们 ; 谷歌对我的问题最为重要:

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

oxb*_*kes 14

这是Martin Odersky对Scala用户邮件列表的回答:

最初的Java通配符类型(如Igarashi和Viroli的ECOOP论文中所述)确实只是存在类型的缩写.有人告诉我,我在FOOL '05关于Wild FJ的论文中读过,通配符的最终版本与存在类型有一些细微的差别.我不知道究竟在什么意义上(他们的形式主义与古典存在主义类型相距太远,无法确定差异),但也许仔细阅读Wild FJ论文会对此有所了解.

所以看起来Scala存在类型和Java通配符似乎是等价的

  • 整个会话的链接将是最有用的 (2认同)

Dan*_*ral 6

它们应该是等价的,因为它们的主要目的是与Java的通配符交互.


小智 5

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

例如,在Scala中:

scala> def foo(x : List[_ >: Int]) = x
foo: (x: List[_ >: Int])List[Any]
Run Code Online (Sandbox Code Playgroud)

foo采用具有Int下限的参数列表.

  • Java的通配符也支持下界。public List<?> foo(List<? super Integer> lst) { return lst; } } (2认同)

fot*_*ton 5

Martin Odersky更详细的解答(其余的可以在这里找到):

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