向后二进制兼容性(或向下兼容性) - 使用旧版本库API构建的客户端在新版本上运行的功能(wiki )。
向上二进制兼容性(或转发兼容性) - 使用新版本的库API构建的客户端在旧版本(wiki)上运行的功能
Sun的一般文档关于JDK Incompatibilities in J2SE 5.0 since 1.4.2(以及Java SE 6 compatibility with J2SE 5.0)描述了JDK的兼容性如下:
JDK 5.0 向上与Java 2 SDK v1.4.2二进制兼容,但下面列出的不兼容性除外。这意味着,除了指出的不兼容性之外,使用1.4.2版编译器构建的类文件将在JDK 5.0中正确运行。
我认为文档编写者在这句话中具有混合术语“向上”和“向后”兼容性。它们描述了“向后”兼容性,但将此功能称为“向上”兼容性。
这是一个错字,错误或预期的术语吗? JDK是“向上”还是“向后”兼容?
答案 0 :(得分:71)
请注意,对于向后兼容的内容,必须存在向前兼容的对应方(有意或无意)。例如:DVD读卡器向后兼容CD还是CD向前兼容DVD读卡器?
在这种情况下,它取决于您查看编译器(或它生成的字节码)还是虚拟机。
编译器不向后兼容,因为使用Java5 JDK生成的字节码不能在Java 1.4 jvm中运行(除非使用-target 1.4
标志进行编译)。但是JVM是向后兼容的,因为它可以运行较旧的字节码。
所以我猜他们选择从javac的角度考虑兼容性(因为它是特定于JDK的部分),这意味着生成的字节码可以在jvm的未来版本中运行(这是更相关的到JRE,但也捆绑在JDK中。
简而言之,我们可以说:
(它也可以作为一个应该在很久以前学到的教训:编写编译器的人通常是正确的,我们使用它们的人错了xD)
顺便说一下,配对后退/前进,下降/上升而不是将它们混合起来更有意义吗?
答案 1 :(得分: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中的不兼容性
(没有序言 - 只是不兼容的列表。)
答案 2 :(得分:11)
仅落后。正向compat(“优雅地接受用于其自身的更高版本的输入”)将要求1.5 JVM能够运行1.6编译代码,但它不能。
向后需要“如果它可以使用旧设备生成的输入”,这是正确的,因为1.6 JVM可以运行1.5个编译代码。
JDK / JRE的每个版本都与Java字节码的版本一致。每个编译器都生成特定字节码版本的代码。每个JVM都了解特定字节码版本的版本和所有早期版本。
当JVM加载一个类时,它会检查字节码版本,如果它是>比JVM最新理解的版本你会得到一个错误。 (ClassVersionError或其他)。
答案 3 :(得分:6)
Java(VM)向后兼容。由java 1.4.2构建的代码将在1.5& 6个VM。 JDK编译器不向后兼容。因此,java 1.5无法编译代码,例如在1.4.2上运行。
答案 4 :(得分:3)
JDK是向后兼容的,即符合1.4.2规范的字节代码将在Java 5 JVM上运行
答案 5 :(得分:1)
根据维基的定义,JDK向下兼容。
答案 6 :(得分:1)
它应向后兼容。
答案 7 :(得分:-2)
jdk向上兼容 - 新版本可以在旧版本上运行