9

我的理解是,为了保持源代码兼容性,Java 从不向公共接口引入新方法,因为这会破坏实现接口的现有客户端。 Java 发行说明状态

一般来说,该政策如下,除了下面进一步列出的任何不兼容性:

  • 维护版本(例如 1.4.1、1.4.2)不引入任何新的语言功能或 API。它们将保持彼此的源兼容性。

  • 功能版本和主要版本(例如 1.3.0、1.4.0、5.0)保持向上但不向下的源兼容性。

然而,这些包java.sqljavax.sql继续发展并引入了许多不兼容的变化。例如,我注意到以下不兼容的更改(在 Java 6 中引入):

你知道这些方法是如何以及为什么被添加的吗?是否java.sql受到与平台其他部分不同的对待?你知道围绕这些添加的讨论/JSR 吗?

4

4 回答 4

9

我收到了来自 Sun 开发人员的以下回复

JDK 7 等功能版本的 JDK 中 API 的一般演进策略是

  1. 不要破坏二进制兼容性(如 JLSv3 第 13 章中所定义)
  2. 避免引入源不兼容
  3. 管理行为兼容性变化

(有关不同类型兼容性的更多信息,请参阅

“兼容性种类:源、二进制和行为”“兼容进化的 BigDecimal”

向接口添加方法是二进制兼容的,但源代码不兼容,因此通常不这样做。一般来说,一个接口实现得越广泛,我们就越不可能向它添加方法。JDBC 区域是这个政策的一个例外,它使用更宽松的升级规则,但是当人们想要升级到新的 JDK 版本时,这确实会导致真正的问题。

于 2009-08-11T19:42:19.860 回答
4

请注意,添加新方法只会破坏源代码兼容性,已编译的 JDBC 驱动程序StatementResultSet在 JDBC 驱动程序中的实现将继续在更新的 JDK 上运行。只有当您尝试调用新方法时,您才会得到一个NoSuchMethodError.

于 2009-08-11T16:37:51.853 回答
1

他们可能认为实现这些方法的数据库驱动程序供应商正在与新的 Java 运行时保持同步,并且最好引入有用的新方法并暂时破坏兼容性。

当然,他们本可以设计得更好,这样就不需要破坏兼容性了……</p>

于 2009-08-11T16:31:26.250 回答
1

Sun 从不保证版本之间的源代码兼容性,只保证二进制兼容性。最常见的示例是包含“assert”或“enum”标识符的源代码将无法在 JDK 1.4(用于断言)或 1.5+(用于枚举)下编译,但现有的 .class 文件仍将在那些较新的 JVM 下运行。

您可以尝试使用 -source 标志在较新的 JVM 下编译较旧的 .java 文件,但如果您依赖已更改的 jvm 类,您仍然可能会遇到问题。

于 2009-08-11T16:59:43.447 回答