JDK是“向上”还是“向后”兼容?

后向二进制兼容性(或向下兼容性) – 使用旧版本库API构build的客户端在新版本( wiki )上运行的能力。

向上二进制兼容性(或向前兼容性) – 使用新版本库API构build的客户端能够在旧版本( wiki )上运行。

从1.4.2 (以及Java SE 6与J2SE 5.0的兼容性)开始,Sun的关于JDK 5.0中的 JDK 不兼容性的一般文档描述了JDK的兼容性,如下所示:

除了下面列出的不兼容性以外,JDK 5.0与Java 2 SDK v1.4.2是二进制兼容的。 这意味着,除了指出的不兼容性, 使用1.4.2编译器构build的类文件将在JDK 5.0中正确运行

我认为文献作者在这句话中混合了 “向上”和“向后”相容的术语。 他们描述了一个“向后”的兼容性,但称这个function为“向上”的兼容性。

这是一个错字,错误还是打算在这里? JDK是“向上”还是“向后”兼容?

请注意,对于某些向后兼容的应用程序,必须有一个对应的(有意或无意)转发兼容的。 例如:DVD阅读器是向后兼容CD还是CD与DVD阅读器兼容?

在这种情况下,这取决于是否查看编译器(或生成的字节码)或虚拟机。

编译器不向后兼容,因为使用Java5 JDK生成的字节码不能在Java 1.4 jvm中运行(除非使用-target 1.4标志编译)。 但是JVM向后兼容,因为它可以运行较旧的字节码。

所以我想他们select从javac的angular度来考虑兼容性(因为它是JDK特有的部分),这意味着生成的字节码可以在未来版本的jvm中运行(这更多地与JRE ,也捆绑在JDK中)。

简而言之,我们可以说:

  • JDK的(通常)是向前兼容的。
  • JRE是(通常)向后兼容的。

(这也是早就应该学习的一个教训:编写编译器的人通常是对的,我们人们用它们错了xD)

顺便说一下,将它们向前/向后和向下/向上配对而不是将它们混合起来更有意义?

扩展答案,包括最近的Java …

Java SE 7和JDK 7兼容性

来自Oracle未注明date的页面的引用:

兼容性是一个复杂的问题。 本文档讨论了与Java平台版本相关的三种潜在的不兼容性:

  1. 来源 :源代码兼容性涉及将Java源代码转换为类文件,包括代码是否仍然编译。
  2. 二进制 :二进制兼容性在“Java语言规范”中定义为保留无误链接的能力。
  3. 行为 :行为兼容性包括在运行时执行的代码的语义。

…和

Java SE 7和Java SE 6之间的不兼容性Java SE 7与以前版本的Java平台powershell兼容。 几乎所有现有的程序都应该在Java SE 7上运行而不需要修改。 但是,在JRE和JDK中,有一些潜在的微小的潜在源和二进制不兼容问题,涉及到罕见情况和“angular落案例”,为了完整起见,这里logging了这些情况。

Java SE 7语言,JVM或Java SE API中的不兼容性

…和

JDK 7和JDK 6之间不兼容

在javac中,在HotSpot或Java SE API中的JDK 7不兼容

(没有序言 – 只是一个不兼容的列表。)

只有后退。 向前compat(“优雅地接受为更高版本本身的input”)将需要1.5 JVM能够运行1.6编译的代码,它不能。

向后需要“如果它可以使用旧设备生成的input”,这是正确的,因为1.6 JVM可以运行1.5编译代码。

JDK / JRE的每个版本都与Java字节码的版本一致。 每个编译器生成特定字节码版本的代码。 每个JVM都可以理解特定字节码版本的版本和所有早期版本。

当JVM加载一个类时,它会检查字节码的版本,如果它比JVMs的最新理解版本更糟,你会得到一个错误。 (ClassVersionError或其他)。

Java(VM)是向后兼容的。 Java 1.4.2构build的代码将运行在1.5和6虚拟机上。 JDK编译器不向后兼容。 所以代码不能被java 1.5编译成1.4.2运行。

JDK是向后兼容的,即符合1.4.2规范的字节代码将在Java 5 JVM上运行

根据wiki的定义,JDK向下兼容。

它应该是向后兼容的。

jdk是向上兼容的 – 新版本可以在旧版本上运行