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.sql
和javax.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的一般演化策略是
- 不要破坏二进制兼容性(如JLSv3第13章中所定义)
- 避免引入源不兼容性
- 管理行为兼容性变更
(更多,远远超过你想要阅读的各种兼容性,请参阅
“各种兼容性:来源,二元和行为”和“兼容进化的BigDecimal”
向接口添加方法是二进制兼容的,但源不兼容,因此通常不会这样做。 通常,接口越广泛实现,我们向其添加方法的可能性就越小。 JDBC区域是此策略的一个例外,它使用更宽松的升级规则,但当人们想要升级到新的JDK版本时,这确实会引起真正的问题。
请注意,添加新方法只会破坏源兼容性,JDBC驱动程序中已编译的Statement
或ResultSet
实现将继续在较新的JDK上运行。 只有当您尝试调用新方法时,才会获得NoSuchMethodError
。
他们可能认为实现这些方法的数据库驱动程序供应商正在与新的Java运行时保持同步,并且最好引入有用的新方法并暂时破坏兼容性。
当然,他们可以更好地设计它,这样就不需要破坏兼容性……
Sun从不保证版本之间的源兼容性,只保证二进制兼容性 最常见的示例是包含’assert’或’enum’标识符的源代码将无法在JDK 1.4(用于assert)或1.5+(用于枚举)下编译,但现有的.class文件仍将在这些较新的JVM下运行。
您可以尝试使用-source标志在较新的JVM下编译较旧的.java文件,但如果您依赖已更改的jvm类,则可能仍会遇到问题。