是否有任何 Java 版本之间向后不兼容的具体示例?

Java版本之间是否存在不兼容性,其中针对Java版本X的Java源代码/Java类文件无法在版本Y下编译/运行(其中Y>X)?

通过“Java发布”,我的意思是这样的版本:

  • JDK 1.0 (1996年1月)
  • JDK 1.1 (1997年2月)
  • J2SE 1.2(1998 年 12 月)
  • J2SE 1.3 (2000 年 5 月)
  • J2SE 1.4(2002 年 2 月)
  • J2SE 5.0(2004 年 9 月)
  • Java SE 6(2006 年 12 月)

条款规定:

  • 请尽可能提供参考和代码示例。
  • 请尽量在你的答案中非常具体/具体。
  • 标记为@Deprecated的类不算作向后不兼容。

答案 1

各种版本的兼容性说明:

我记得的第一个主要问题是在Java 1.4中引入的。它影响了很多JUnit代码assert


答案 2

首先,Sun实际上认为你提到的所有版本(当然1.0除外)都是次要版本,而不是主要版本。

我不知道在那个时候有任何二进制不兼容的例子。但是,有一些源不兼容的示例:

  • 在Java 5中,“enum”成为一个保留词;以前不是。因此,有些源文件使用枚举作为标识符,可以在java 1.4中编译,而java 5.0中无法编译。但是,您可以使用 -source 1.4 进行编译来解决此问题。

  • 向接口添加方法也会破坏源兼容性。如果实现一个接口,然后尝试使用向接口添加新方法的 JDK 编译该实现,则源文件将不再成功编译,因为它不会实现接口的所有成员。java.sql.Statement和其他jdbc接口经常发生这种情况。这些“无效”实现的编译形式仍将有效,除非您实际调用其中一个不存在的方法;如果你这样做,一个MissingMethodException将被抛出。

这些是我能从头顶上回忆起的几个例子,可能还有其他例子。


推荐