小编典典

为什么不从下一个JVM中删除类型擦除?

java

Java在Java 5中引入了带有泛型的类型擦除,因此它们可以在Java的旧版本上使用。这是兼容性的折衷。从那以后,我们就失去了兼容性–字节码可以在JVM的更高版本上运行,但不能在较早的版本上运行。这似乎是最糟糕的选择:我们丢失了类型信息,并且仍然无法在较旧版本上运行针对较新版本JVM编译的字节码。发生了什么?

具体来说,我是在问是否存在任何技术原因,导致无法在下一版JVM中删除类型擦除(假设像以前的发行版一样,其字节码也将无法在上一版中运行)。

[3]:对于确实喜欢它的人,可以以类似于Retrolambda的方式向后移植类型擦除。

编辑:我认为对向后兼容性与向前兼容性的定义的讨论使这个问题变得晦涩。


阅读 256

收藏
2020-12-03

共1个答案

小编典典

在某种程度上,将来将通过项目valhalla删除擦除操作,以实现针对价值类型的专门实现。

或者更准确地说,类型擦除确实意味着不存在泛型的类型专门化,而valhalla将在基元上引入专门化。

具体来说,我在问是否有任何技术原因导致无法在下一版JVM中删除类型擦除

性能。您不必为泛型类型,实例或生成的类的所有组合生成专门的代码,而不必携带类型标签,多态内联缓存和运行时类型检查(由编译器生成的instanceof检查)保持简单,我们仍然可以通过编译时检查进行类型安全。

当然也有很多缺点,但是已经进行了权衡,还有一个问题是什么会促使JVM开发人员改变这种权衡。

而且这也可能是兼容性,可能有一些代码依靠依赖类型擦除来执行未经检查的强制转换以滥用泛型集合,如果强制执行类型约束,类型擦除会破坏类型集合。

2020-12-03