首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java 7&8之间用于重载函数的源代码兼容性

java 7&8之间用于重载函数的源代码兼容性
EN

Stack Overflow用户
提问于 2015-03-26 19:57:38
回答 2查看 154关注 0票数 2

我为Java 7&8为JDBC驱动程序创建了一个jar (使用-source/-target编译选项)。但是,我在编译在ResultSet接口中使用新/重载方法的应用程序时遇到了困难:

// Java 8中的New updateObject(int columnIndex,Object x,SQLType targetSqlType) //可在Java 7中查阅 updateObject(int columnIndex,Object x,int targetSqlType)

请注意,SQLType是Java8中引入的一个新接口。

我使用Java 8编译了驱动程序,它运行得很好。但是,当任何使用驱动程序的应用程序访问Java7中的updateObject(int, Object, int)方法时,都会收到一个编译错误,上面写着“未找到java.sql.SQLType类文件”,尽管应用程序没有使用SQLType。我认为这是因为Java查看了所有重载的方法来确定最具体的方法,当这样做时,它无法访问Java8中的新updateObject方法(因为SQLType不是在Java7中定义的)。知道我能怎么解决这个问题吗?

注意,updateObject方法在Java8中的ResultSet接口中有一个默认的实现--所以我甚至不能在新方法中使用更通用的类型而不是SQLType。在这种情况下,任何使用新方法的应用程序都会收到编译错误,表示updateObject不明确。

EN

回答 2

Stack Overflow用户

发布于 2015-03-26 20:58:00

您不能在较低版本(例如,Java 8 )中使用在Java 8中编译的内容(例如,Java 7)。你会得到类似于Unsupported major.minor version...的东西。需要使用两个JAR,一个用于1.7版本,另一个用于1.8版本。最终,如果在JDK上不支持,1.7SQLType就不能有了;另一方面,当您执行1.8版本时,会鼓励您维护重载的版本。

注意,这个无关,与向后兼容性无关。

票数 3
EN

Stack Overflow用户

发布于 2015-03-27 09:19:35

在这种情况下,我会称其为应用程序的错误。毕竟,您的类正在实现ResultSet接口,使用JDBC的应用程序应该针对该接口而不是实现类进行编译。

如果Java 7(其中不存在SQLType )针对Java7版本的ResultSet接口编译Java 7应用程序,应该不会出现问题,因为该接口没有那个冒犯的updateObject方法,而且实现类有哪些其他方法也无关紧要。如果操作正确,编译器甚至不应该知道实现类型将是您的特定类。

您可以通过声明Statement实现类的方法来返回ResultSet而不是更特定的类型来强制正确使用。同样的情况也适用于Driver返回的DriverConnection返回的Statement。使用协变量返回类型来声明特定的实现类是很有诱惑力的,但是每当您的方法声明interface类型时,您就会指导应用程序程序员使用基于interface的方法,避免问题中描述的问题。

如果需要,应用程序程序员仍然可以使用类型强制转换或更好的unwrap来访问您的实现的自定义特性。但是,这是明确的,程序员知道可能会发生什么潜在的问题(以及如何避免这些问题)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29287688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档