我的理解是,为了保持源兼容性,Java从不向公共接口引入新方法,因为这会破坏实现接口的现有客户端。 Java Release notes个州
一般来说,政策如下, 除了任何不兼容性 在下面进一步列出:
维护版本(例如1.4.1, 1.4.2)不要引入任何新的语言功能或API。他们会的 保持与...的源兼容性 彼此。
功能发布和专业 版本(例如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吗?
答案 0 :(得分:9)
我收到了Sun开发人员的以下回复
JDK中用于JDK 7等功能发布的API的一般演进策略是
(更多,比您想要阅读的各种兼容性更多,请参阅
"Kinds of Compatibility: Source, Binary, and Behavioral" 和 "Compatibly Evolving BigDecimal"
向接口添加方法是二进制兼容但源不兼容,因此通常不会这样做。通常,接口实现得越广泛,我们就越不可能向其添加方法。 JDBC区域是此策略的一个例外,它使用更宽松的升级规则,但当人们想要升级到新的JDK版本时,这确实会引起真正的问题。
答案 1 :(得分:4)
请注意,添加新方法只会破坏源兼容性,JDBC驱动程序中已编译的Statement
或ResultSet
实现将继续在较新的JDK上运行。只有当您尝试调用新方法时,才会获得NoSuchMethodError
。
答案 2 :(得分:1)
他们可能认为实现这些方法的数据库驱动程序供应商正在与新的Java运行时保持同步,并且最好引入有用的新方法并暂时破坏兼容性。
当然,他们可以更好地设计它,这样就不需要破坏兼容性......
答案 3 :(得分:1)
Sun永远不会保证版本之间的源兼容性,只保证二进制兼容性。最常见的示例是包含'assert'或'enum'标识符的源代码不能在JDK 1.4(用于断言)或1.5+(用于枚举)下编译,但现有的.class文件仍将在这些较新的JVM下运行。 / p>
您可以尝试使用-source标志在较新的JVM下编译较旧的.java文件,但如果您依赖已更改的jvm类,则可能仍会遇到问题。