Java 6 Source向后兼容性和SQL

我的理解是,为了保持源兼容性,Java从不向公共接口引入新方法,因为这会破坏实现接口的现有客户端。 Java Release指出了各州

一般而言,该政策如下,但下列进一步列出的任何不兼容性除外:

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

  • function版本和主要版本(例如1.3.0,1.4.0,5.0)保持向上但不向下兼容。

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

  • java.sql.Statement扩展了java.sql.Wrapper ,需要新的两个新方法。
  • java.sql.Statement引入了3种新方法
  • java.sql.PreparedStatement引入了19种新方法!
  • java.sql.ResultSet引入了48种新方法!

你知道这些方法是如何以及为什么被添加的? java.sql的处理方式与平台的其他部分不同吗? 你知道关于这些新增内容的讨论/ JSR吗?

我收到了Sun Developer的以下回复

JDK中用于JDK 7等function发布的API的一般演化策略是

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

(更多,远远超过你想要阅读的各种兼容性,请参阅

“各种兼容性:来源,二元和行为”和“兼容进化的BigDecimal”

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

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

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

当然,他们可以更好地设计它,这样就不需要破坏兼容性……

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

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