Scala是否有可能在不更改JVM的情况下使用具体化的泛型?

cdm*_*kay 28 java generics jvm scala

我最近开始学习Scala并且很失望(但并不感到惊讶)他们的泛型也是通过类型擦除来实现的.

我的问题是,Scala是否有可能使用具体的泛型,或者JVM是否需要以某种方式进行更改?如果确实需要更改JVM,究竟需要更改什么?

oxb*_*kes 21

否 - 如果该字节码不支持具体化的泛型,则Scala不可能作为Java等效字节码运行.

当你问"需要改变什么?" ,答案是:字节码规范.目前,字节码不允许定义变量的参数化类型.已经决定,由于对字节码的修改以支持具体化的泛型将破坏向后兼容性,因此必须通过类型擦除来实现泛型.

为了解决这个问题,Scala利用其implicit机制的强大功能来定义Manifest可以在任何范围内导入的内容,以便在运行时发现类型信息.清单是实验性的,很大程度上没有文档,但它们是作为2.8的库的一部分而来的.这是Scala reified generics/Manifests的另一个很好的资源

  • IBM X10在编译为Java时提供了reified泛型(它也可以编译为C++).看看这个:http://x10.sourceforge.net/documentation/papers/X10Workshop2012/slides/Takeuchi.pdf (4认同)
  • 这个答案具有误导性 - 没有基本的JVM限制阻止您实现具体化的泛型.所有具体的泛型要求是编译器可以根据需要发出类型专用类,这在使用当前JVM字节码的JVM上是完全可能的.选择以Java风格实现泛型(使用类型擦除)主要是语言/编译器设计决策(Java为了保持向后兼容性而采取这种决策). (4认同)

Dan*_*ral 5

为了补充oxbow_lakes,Stack Overflow上有一个关于如何在Scala中绕过类型擦除的问题.