【发布时间】:2016-06-27 13:56:19
【问题描述】:
Java 在 Java 5 中使用泛型引入了类型擦除,因此它们可以在旧版本的 Java 上工作。这是兼容性的权衡。我们已经失去了兼容性[1][2] [3]——字节码可以在更高版本的 JVM 上运行,但不能在更早的版本上运行。这看起来可能是更糟糕的选择:我们丢失了类型信息,并且我们仍然无法在旧版本上运行为新版本 JVM 编译的字节码。发生了什么?
具体来说,我想问是否有任何技术原因导致无法在 JVM 的下一个版本中删除类型擦除(假设,像以前的版本一样,它的字节码无论如何都无法在最后一个版本上运行)。
[3]:对于那些真正喜欢它的人,类型擦除可以以类似于 retrolambda 的方式向后移植。
编辑:我认为关于向后与向前兼容性定义的讨论模糊了这个问题。
【问题讨论】:
-
向后兼容性从未丢失。旧的 Java 1.1 程序很可能仍然可以在 JRE 8 VM 上顺利运行,这就是链接帖子所说的。
-
不完全一样,也可以参考stackoverflow.com/questions/4692626/…
-
@Prime - 但这并不是 Java 上下文中向后兼容性的含义。
-
Java 8 向后兼容为旧版 Java 编写的代码。您可能认为您的代码与未来的 JRE 向前兼容,但实际上是那些未来的 JRE 与您的旧代码向后兼容。您的问题表明对 Java 中向后兼容的含义缺乏理解。
-
@Prime 你是对的,海报是错的。您编写的代码是向前兼容的。它在 JVM 8、9、10、11 上编译和运行……生成的字节码不向后兼容。一世。 e 你不能在 jvm 5,4,3,2 上运行它。 JVM 本身是向后兼容的,因为它可以运行 JVM 5、4、3、2 代码。 JDK 也是如此,因为它支持旧代码的编译。类型错误是一个已知问题,正在进行研究和讨论以更改或删除它。
标签: java jvm backwards-compatibility type-erasure