我为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不明确。
发布于 2015-03-26 20:58:00
您不能在较低版本(例如,Java 8 )中使用在Java 8中编译的内容(例如,Java 7)。你会得到类似于Unsupported major.minor version...的东西。需要使用两个JAR,一个用于1.7版本,另一个用于1.8版本。最终,如果在JDK上不支持,1.7的SQLType就不能有了;另一方面,当您执行1.8版本时,会鼓励您维护重载的版本。
注意,这个与无关,与向后兼容性无关。
发布于 2015-03-27 09:19:35
在这种情况下,我会称其为应用程序的错误。毕竟,您的类正在实现ResultSet接口,使用JDBC的应用程序应该针对该接口而不是实现类进行编译。
如果Java 7(其中不存在SQLType )针对Java7版本的ResultSet接口编译Java 7应用程序,应该不会出现问题,因为该接口没有那个冒犯的updateObject方法,而且实现类有哪些其他方法也无关紧要。如果操作正确,编译器甚至不应该知道实现类型将是您的特定类。
您可以通过声明Statement实现类的方法来返回ResultSet而不是更特定的类型来强制正确使用。同样的情况也适用于Driver返回的Driver和Connection返回的Statement。使用协变量返回类型来声明特定的实现类是很有诱惑力的,但是每当您的方法声明interface类型时,您就会指导应用程序程序员使用基于interface的方法,避免问题中描述的问题。
如果需要,应用程序程序员仍然可以使用类型强制转换或更好的unwrap来访问您的实现的自定义特性。但是,这是明确的,程序员知道可能会发生什么潜在的问题(以及如何避免这些问题)。
https://stackoverflow.com/questions/29287688
复制相似问题