lin*_*ild 60 java backwards-compatibility binary-compatibility forward-compatibility
向后二进制兼容性(或向下兼容性) - 使用旧版本库API构建的客户端在新版本(wiki)上运行的能力.
向上二进制兼容性(或向前兼容性) - 使用新版本的库API构建的客户端在旧版本(wiki)上运行的能力.
关于自1.4.2以来J2SE 5.0中 JDK 不兼容性的一般Sun文档(以及Java SE 6与J2SE 5.0的兼容性)描述了JDK的兼容性,如下所示:
除了下面列出的不兼容性之外,JDK 5.0 与Java 2 SDK v1.4.2 向上二进制兼容.这意味着,除了指出的不兼容性之外,使用1.4.2版编译器构建的类文件将在JDK 5.0中正确运行.
我认为文档编写者在这句话中混淆了 "向上"和"向后"兼容性术语.它们描述了"向后"兼容性,但将此功能称为"向上"兼容性.
这是一个错字,错误或预期的术语吗?JDK"向上"还是"向后"兼容?
for*_*ran 78
请注意,对于向后兼容的内容,必须存在向前兼容的对应方(有意或无意).例如:DVD阅读器向后兼容CD还是CD向前兼容DVD阅读器?
在这种情况下,它取决于您是否查看编译器(或它生成的字节码)或虚拟机.
编译器不向后兼容,因为使用Java5 JDK生成的字节码不能在Java 1.4 jvm中运行(除非使用-target 1.4
标志进行编译).但是JVM是向后兼容的,因为它可以运行较旧的字节码.
所以我猜他们选择从javac的角度考虑兼容性(因为它是特定于JDK的部分),这意味着生成的字节码可以在jvm的未来版本中运行(这与JRE更相关) ,还捆绑在JDK中).
简而言之,我们可以说:
(它也是很久以前应该学到的一个教训:编写编译器的人通常是正确的,我们使用它们的人错了xD)
顺便说一下,配对后退/前进和下降/向上而不是将它们混合起来更有意义吗?
Gra*_*rin 20
扩展答案以包括最新的Java ...
Oracle未注明日期的页面引用:
兼容性是一个复杂的问题.本文档讨论了与Java平台发布相关的三种潜在不兼容性:
- 来源:源兼容性问题涉及将Java源代码转换为类文件,包括代码是否仍然可以编译.
- 二进制:二进制兼容性在Java语言规范中定义为保留无错误链接的能力.
- 行为:行为兼容性包括在运行时执行的代码的语义.
......和
Java SE 7与Java SE 6之间的不兼容性Java SE 7与以前版本的Java平台强大兼容.几乎所有现有程序都应该在Java SE 7上运行而无需修改.但是,JRE和JDK中存在一些较小的潜在源和二进制不兼容性,这些不兼容性涉及罕见的情况和为此完整性而记录的"极端情况".
Java SE 7语言,JVM或Java SE API中的不兼容性
......和
JDK 7在javac,HotSpot或Java SE API中的不兼容性
(没有序言 - 只是一个不兼容的列表.)
Mik*_*e Q 12
仅落后.forward compat("优雅地接受用于其自身的更高版本的输入")将要求1.5 JVM能够运行1.6编译代码,但它不能.
向后需要"如果它可以使用旧设备生成的输入",这是正确的,因为1.6 JVM可以运行1.5个编译代码.
JDK/JRE的每个版本都与Java字节码的版本一致.每个编译器都生成特定字节码版本的代码.每个JVM都了解特定字节码版本的版本和所有早期版本.
当JVM加载一个类时,它会检查字节码版本,如果它大于JVM最新版本,你将得到一个错误.(ClassVersionError或其他).