JDK是向上还是向下兼容的?

79

向后二进制兼容性(或称向下兼容性)-是指使用旧版库API构建的客户端能够在新版库API上运行 (维基百科).

向上二进制兼容性(或称向前兼容性)-是指使用新版库API构建的客户端能够在旧版库API上运行 (维基百科).

关于JDK不兼容的一般Sun文档:自J2SE 5.0起的不兼容性,自1.4.2以来 (还有Java SE 6与J2SE 5.0的兼容性) 描述了JDK的兼容性如下:

JDK 5.0 与 Java 2 SDK,v1.4.2 具有向上的二进制兼容性,除了以下不兼容情况。这意味着,除了所述的不兼容情况外,使用 1.4.2 版编译器构建的类文件将会在 JDK 5.0 上正确运行

我认为文档撰写者在这个句子中混淆了“向上”和“向后”兼容性。他们描述了“向后”兼容性,但将其称为“向上”兼容性功能。

这是一个错别字、错误还是故意使用的术语? JDK 是“向上”还是“向后”兼容的?


1
顺便说一句:你应该真正关注Java 6,因为Java 5.0已经停止维护了一段时间。 - Peter Lawrey
Java 6在文档中也被描述为“向上二进制兼容”。 - linuxbuild
仅适用于不兼容的情况:https://dev59.com/vXI-5IYBdhLWcg3w0cKG - Ciro Santilli OurBigBook.com
8个回答

111
请注意,要想实现向后兼容,必须存在一个向前兼容的对应物(无论是有意还是无意)。例如:DVD读取器是否向后兼容CD,还是CD向前兼容DVD读取器?
在这种情况下,这取决于您是看编译器(或其生成的字节码)还是虚拟机。
编译器不具备向后兼容性,因为使用Java5 JDK生成的字节码无法在Java 1.4 JVM中运行(除非使用-target 1.4标志进行编译)。但是JVM是向后兼容的,因为它可以运行旧的字节码。
因此,我猜他们选择从javac的角度考虑兼容性(因为它是特定于JDK的部分),这意味着生成的字节码可以在未来版本的jvm中运行(这更多地涉及到JRE,但也捆绑在JDK中)。
简而言之,我们可以说:
  • JDK通常是向前兼容的。
  • JRE通常是向后兼容的。
(这也是一个早该学会的教训:编写编译器的人通常是正确的,而我们使用它们的人是错误的 xD)
顺便说一句,将向后/向前和向下/向上配对会更有意义,而不是将它们混合起来。

22

扩展答案以包含最新的Java...

Java SE 7和JDK 7的兼容性

摘自Oracle未标日期的网页:

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

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

...和

Java SE 7与Java SE 6之间的不兼容性 Java SE 7与Java平台的早期版本高度兼容。几乎所有现有程序都可以在Java SE 7上运行而不需要修改。但是,在JRE和JDK中有一些潜在的源代码和二进制不兼容性,涉及罕见情况和“边缘情况”,这里进行完整记录。

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

...和

JDK 7与JDK 6之间的不兼容性

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

(此处没有前言,只有一个不兼容性列表。)


17

仅支持向后兼容。要支持向前兼容("优雅地接受针对其稍后版本的输入"),需要1.5 JVM能够运行1.6编译的代码,但它做不到。

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

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

当JVM加载类时,会检查字节码版本,如果大于JVM的最新理解版本,则会出现错误(ClassVersionError或其他错误)。


9

Java(虚拟机)具有向后兼容性。由Java 1.4.2构建的代码将在1.5和6虚拟机上运行。JDK编译器不具备向后兼容性。因此,例如,不能使用Java 1.5编译代码以在1.4.2上运行。


3

JDK向后兼容,即符合1.4.2规范的字节码可以在Java 5 JVM上运行。


2

JDK根据维基百科的定义是向下兼容的。


1

它应该向后兼容。


-1

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


源代码和字节码的兼容性是不同的。 - RayanFar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接