JDK是“向上”还是“向后”兼容?Java SE 7 和 JDK 7 兼容性

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

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

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

JDK 5.0 与 Java 2 SDK v1.4.2 进制兼容,但下面列出的不兼容性除外。这意味着,除了注意到的不兼容性之外,使用版本 1.4.2 编译器构建的类文件将在 JDK 5.0 中正常运行

我想文档编写者在这句话中混淆了术语“向上”和“向后”兼容性。它们描述了“向后”兼容性,但将此功能称为“向上”兼容性。

这是拼写错误,错误还是预期的术语?JDK是“向上”还是“向后”兼容?


答案 1

请注意,要使某些内容向后兼容,必须有一个向前兼容的对应项(有意或无意)。例如:DVD阅读器是否向后兼容CD或CD向前兼容DVD阅读器?

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

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

所以我猜他们选择从javac的角度考虑兼容性(因为它是特定于JDK的部分),这意味着生成的字节码可以在jvm的未来版本中运行(这与JRE更相关,但也捆绑在JDK中)。

简而言之,我们可以说:

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

(这也是很久以前应该吸取的教训:编写编译器的人通常是对的,而我们使用它们的人是错误的xD)

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


答案 2

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

Java SE 7 和 JDK 7 兼容性

引自甲骨文未注明日期的页面:

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

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

...和

Java SE 7 和 Java SE 6 之间的不兼容性Java SE 7 与以前版本的 Java 平台高度兼容。几乎所有现有程序都应该在 Java SE 7 上运行,无需修改。但是,JRE 和 JDK 中存在一些次要的潜在来源和二进制不兼容性,这些缺陷涉及罕见的情况和“极端情况”,为了完整起见,此处记录了这些情况和“极端情况”。

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

...和

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

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

(没有序言 - 只是一个不兼容的清单。


推荐