如何改进Java,使其不再需要执行类型擦除?


16

关于泛型官方Java教程介绍了类型擦除以及将其添加到编译器的原因:

当实例化泛型类型时,编译器会通过一种称为类型擦除的技术来转换这些类型,在该过程中,编译器将删除与类或方法中的类型参数和类型参数有关的所有信息。通过类型擦除,使用泛型的Java应用程序可以维护与泛型之前创建的Java库和应用程序的二进制兼容性。

这很可能是一种务实的方法,或者也许是最不痛苦的方法。但是,既然泛型已在整个行业得到广泛支持,那么为了使我们不需要类型擦除,该怎么办?不需要破坏向后兼容性是否可行,或者如果可行,是否可行?

上面引用中的最后一个语句是否已成为自我参照?也就是说:“类型擦除使使用泛型的Java应用程序能够与Java库和使用执行类型擦除的Java版本创建的应用程序保持二进制兼容性。”


1
Sun 1.4已停产。IBM仍在其平台上支持1.4。

@ThorbjørnRavnAndersen:至少对于我父亲地下室的平台,没有 1.5。
约尔格W¯¯米塔格

@ThorbjørnRavnAndersen不仅如此,而且人们还可以购买对JVM早期版本的扩展支持。最后我听说它虽然很贵。
maple_shaft

1
我们这里没有人拥有水晶球,因此不负责任。如果您将问题从“将永远存在...”改写为“在Java的未来版本中执行类型
清除的

@JörgWMittag会是2012年实际用于生产的平台吗?

Answers:


7

寿命终止适用于Java开发工具包和Java运行时环境。并且只有Oracle(Sun)版本。但这不适用于第三方编写的应用程序。目的是永不破坏在JVM上运行过的代码,因此Java不太可能会停止进行类型擦除。

当然,C#还以向后兼容的方式在以后的版本中引入了泛型,而没有进行类型擦除,但是从根本上讲,它意味着复制所有集合类。我想的是Java设计师不想做的事情,以及为什么他们首先选择类型擦除。如果没有值类型,则非类型擦除的泛型的优势不会太大。


6
OpenJDK团队已经讨论过再次考虑通用化泛型吗?最有可能在Java 9的时间范围内认真研究,如果技术上可行,则应在Java 10的时间范围内交付。但这对我来说是严肃的预言。
Martijn Verburg

类型擦除是由编译器而不是JVM完成的。引入标准化的泛型将需要一个新的编译器和新的JVM,但是大概它们仍可以与旧代码一起使用。
2012年

@Gabe:显然它们将在新版本中引入,因此将有新的编译器和新的JVM。但这还需要复制标准库的重要部分,因为与之相比,新代码需要通用版本,而向后兼容则需要非通用版本。.NET在2.0版中做到了这一点,Java却避免了这样做。.NET具有值类型(结构),并且对它们的一流支持阻止了类型擦除。Java没有,因此对泛型泛型的压力要小得多。
Jan Hudec 2012年

扬:我只是在评论泛型化并不自动意味着所有旧代码都被破坏的事实。我还要补充一点,List<int>肯定可以使a的工作负载比当前的工作效率高得多List<Integer>
加布

@Gabe:我们不同意这一点。我只想指出主要缺点。
Jan Hudec 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.