我知道交叉编译的Java代码不能使用新的语言功能,IE没有像Java 8中的lambdas或Java 7中的try-with-resources这样的功能。
但是可以引用在新Java版本中添加的新类吗?
假设我有一个支持Java 6+的库,我有一些接受日期作为参数的方法
对于Java 6,我使用java.util.Date
提供API,但对于Java 8的用户,我想提供使用java.time.Instant
的选项。
我希望Java 6用户能够使用该库,但如果他们尝试使用ClassNotFoundException
方法,则会遇到Instant
。
是否有一种可接受的方式来做这样的事情,如何使用像Gradle或Maven这样的常用构建工具来实现?
给出的例子是人为的,请不要给出处理时间的替代方法的答案。
答案 0 :(得分:6)
干净利落是不可能的。提及Java 8类型的API无法在Java 6 JRE上加载。
如果您的API使用Java 8类,则Java 6客户端无法针对它进行编译。从理论上讲,您可以用(例如)java.lang.Object
替换Java 8类,并要求客户端代码转换为java.util.Date
或java.time.Instant
,具体取决于执行平台。但我不明白这是多么可以接受,更不用说试图使用你的库的程序员了。
无论如何,你还需要更改你的API。
如果您确实需要支持Java 6,并且您还想在API中开始使用Java 8功能,我建议支持两个单独的API:
你可能能够共享API的两个版本背后的一些代码,但这取决于Java 8依赖关系的“深度”。
然而,更好的想法是咬紧牙关并停止支持Java 6兼容性。 Java 6在2013年2月达到了生命周期。 IMO,您有理由冻结Java 6 API,然后将Java 8 API视为需要客户端的新版本切换到Java 8。
答案 1 :(得分:1)
我认为如果使用目标版本Java 6从Java 8编译javac(或Gradle或Maven),但没有从Java 6设置类路径,它应该可以工作。但是您可能需要在类级别上进行拆分,而不是在方法级别进行拆分。
答案 2 :(得分:1)
正如其他答案解释的那样,基本上答案是“不”。解决方法是使用back-ports功能的代码到早期版本的Java。
具体关于java.time类: