10

我已经听到很多关于不同的 JVM 语言的消息,它们仍然处于蒸汽软件模式,它们建议以某种方式实现具体化。我有这个唠叨的半记得(或完全想象,不知道是哪个)认为我在某处读到 Scala 以某种方式利用 JVM 的类型擦除来完成它无法通过具体化来完成的事情。这对我来说真的没有意义,因为 Scala 是在 CLR 和 JVM 上实现的,所以如果具体化导致某种限制,它将出现在 CLR 实现中(除非 CLR 上的 Scala 只是忽略具体化) .

那么,对于 Scala 的类型擦除是否有好的一面,或者具体化是一件绝对的好事?

4

1 回答 1

13

请参阅Ola Bini 的博客。众所周知,Java 具有使用点协方差,通过在您认为方差合适的地方添加小问号来实现。Scala 具有定义点协方差,由类设计器实现。他说:

泛型是一种复杂的语言特性。当添加到已经具有子类型的现有语言中时,它变得更加复杂。这两个功能在一般情况下不能很好地结合在一起,在将它们添加到语言时必须非常小心。如果虚拟机只需要提供一种语言并且该语言使用相同的泛型,那么将它们添加到虚拟机很简单。但是泛型还没有完成。尚未完全了解如何正确处理,并且正在发生新的突破(Scala 就是一个很好的例子)。在这一点上,泛型不能被认为是“做对了”。不只有一种类型的泛型——它们在实现策略、特性和极端情况方面有所不同。

...

这一切的意思是,如果您想向 JVM 添加具体化的泛型,您应该非常确定该实现可以包含所有想要在自己的泛型版本中进行创新的静态语言,以及所有想要创新的动态语言。创建一个良好的实现和与 Java 库的良好接口工具。因为如果您添加不满足这些标准的具体化泛型,您将扼杀创新并使将 JVM 用作多语言 VM 变得更加困难。

即,如果我们在 JVM 中具体化了泛型,那么这些具体化的泛型很可能不适合我们真正喜欢的 Scala 特性,并且我们会遇到一些次优的问题。

于 2011-08-05T01:55:38.453 回答