我一直听到很多关于不同的JVM语言,仍然处于蒸发软件模式,建议以某种方式实现具体化。我有一半的记忆(或者完全想象,不知道哪个),我认为Scala以某种方式利用JVM的类型擦除做了一些它无法用于具体化的事情。由于Scala是在CLR和JVM上实现的,因此对我来说没有任何意义,所以如果reification会引起某种限制,它会出现在CLR实现中(除非CLR上的Scala只是忽略了具体化)
那么,为Scala键入擦除是否有好的一面,或者说具体化是一件毫无疑问的好事?
答案 0 :(得分:13)
见Ola Bini's blog。众所周知,Java具有使用站点协方差,通过在您认为方差适当的地方几乎没有问号来实现。 Scala具有定义 - 站点协方差,由类设计者实现。他说:
泛型是一种复杂的语言功能。它变得更加 添加到已有的现有语言时会很复杂 子类型。这两个功能并没有很好地结合在一起 一般情况下,将它们添加到a时必须非常小心 语言。如果该机器将它们添加到虚拟机很简单 只需要提供一种语言 - 而且该语言使用相同的语言 仿制药。但是仿制药还没有完成。目前还不完全清楚如何 正确处理并且正在发生新的突破(Scala是一个 很好的例子)。此时,不能考虑泛型 “做得对”。不仅有一种类型的泛型 - 它们各不相同 实施策略,功能和角落案例。
...
这一切意味着如果你想要将改良的泛型添加到 JVM,您应该非常肯定该实现可以包含 所有想要自己创新的静态语言 泛型的版本,以及想要创建的所有动态语言 良好的实现和与Java的良好接口设施 库。因为如果添加不符合的具体化的泛型 这些标准,你将扼杀创新并使之成功 更难将JVM用作多语言VM。
即。如果我们在JVM中使用了泛型,那么很可能这些具体化的泛型不适合我们真正喜欢Scala的功能,而且我们会遇到一些不理想的问题。