问题描述

java10里这个项目提到有可能有reified generics,JVM平台上这是可以实现的?
先放传送门:
- C#能否被编译成Java字节码? - RednaxelaFX 的回答
- Reifiable generics与Type erasure generics各有怎样的优点与缺点? - RednaxelaFX 的回答
首先题主关注的是“在JVM上Java是否可以实现C#风格的reified generics”,其次是
Project Valhalla是否会带有reified generics功能。
上面的第一个传送门里我已经简单讨论了一下在当前的JVM上实现C#(包括其C#风格reified generics)的思路。毫无疑问,实现是可以实现的,而且已经有人实际在JVM上实现过了带有泛型的C#;但不是通过JVM的直接支持,而是通过“模拟”(emulate)的方式实现,所以性能不会很优化,而且跟Java原有的API的兼容性也不好(需要reify的地方要多加参数或者多加字段)。
然后第二个传送门里放了些传送门,讲解了C#风格reified generics和Java风格擦除式generics的异同,并带了一点Project Valhalla的介绍。我写那个回答的时候Valhalla才到了第三版原型,并且各种文档介绍还主要停留在第一版原型上,跟现在相比有许多不同了。
简单说:
- Java在不修改JVM的前提下是否可以实现reified generics:能,但性能难优化,而且与原有API兼容性不好;
- 但是Project Valhalla是打算大幅度修改JVM来支持新功能的,包括新增字节码以及修改原有字节码指令的语义;
- 在第一版原型时,Project Valhalla支持完全reified的泛型,包括值类型和引用类型的泛型参数都可以被reified;
- 到第三版原型的时候,改为主要支持对值类型的泛型支持(包括reification,这个在Project Valhalla里叫做Generic Specialization),而对引用类型则保持与Java 5完全兼容——也就是说引用类型泛型参数不reify;
- 目前看来发展方向还是沿着第三版原型的走,但未来是否会还是决定对引用类型也加上reification,可能性还未完全消失;
- 目前Project Valhalla的新原型用Java实现了一个Java字节码解释器,在它的基础上来实验各种新字节码的设计,探索字节码变更后会带来的好处和会遇到的问题。
这个用Java实现的字节码解释器在这里:
valhalla/valhalla/jdk: 62c3b03ef4ed /interpreter/src/valhalla/interpreter/有兴趣的同学可以钻进去看看 ^_^