Scala的存在类型和Java的通配符之间的区别是什么?
-
06-07-2019 - |
解决方案
这是Martin Odersky对Scala用户邮件列表的回答:
原始Java通配符类型(如ECOOP论文中所述) Igarashi和Viroli)确实只是存在主义的缩写 类型。有人告诉我,我已经阅读了FOOL '05关于Wild FJ的论文 通配符的最终版本有一些细微的差别 存在类型。我不知道究竟是什么意思(他们的 形式主义与古典存在主义类型相去甚远 能够查明差异),但也许仔细阅读Wild FJ论文将对此有所了解。
所以看起来Scala存在类型和Java通配符似乎是等价的
其他提示
它们应该是等价的,因为它们的主要目的是与Java的通配符进行交互。
它们非常相似,但Scala的存在类型应该更强大。例如,Scala的存在类型可以是上限和下限,而Java的通配符只能是上限。
例如,在Scala中:
scala> def foo(x : List[_ >: Int]) = x
foo: (x: List[_ >: Int])List[Any]
foo获取具有Int下限的参数列表。
Martin Odersky的更详细的答案(其余的可以在这里):
Scala基本上需要三种存在类型。首先 是我们需要了解Java的通配符,以及 存在类型是我们对它们的意义。第二是我们 需要了解Java的原始类型,因为它们也是 还是在图书馆里,那些不合格的类型。如果你得到Java raw 类型,例如java.util.List,它是一个你不知道的列表 元素类型。这也可以通过存在主义在Scala中表示 类型。最后,我们需要存在类型作为解释内容的方法 在Scala的高级VM中。 Scala使用擦除模型 泛型,就像Java一样,所以我们没有看到类型参数 程序运行时因为我们需要,我们必须擦除 与Java互操作。但是当我们做反思时会发生什么 或者想表达虚拟机中的内容?我们需要能够 表示JVM使用我们在Scala中的类型所做的事情,以及 存在主义类型让我们这样做。他们让你谈谈那里的类型 你不知道那些类型的某些方面。
List [_]
符号(正如其他答案所指出的那样是对Java的 List [?]
更强大的模拟)是更一般的概念。