我有一个库,Fakir,正如你所问的,我希望保持与Java6的兼容性。同时,如果它的关键抽象Faker能够实现java.util.function.Supplier<T>,那就太好了。
我通过实现自己的Supplier副本来伪造一些东西,这样至少可以使用lambdas,但是由于缺少两个不同的jar文件(啊,Scala,我多么怀念你的不同语言规范的多个版本),有没有办法让我的键抽象向前兼容?
发布于 2015-05-17 23:46:11
我认为这是不可能的。在某些情况下,您需要进行一次飞跃,并且您的库不再适用于8之前版本的java。你现在可以各取所需,缺点是目前还没有很多熟悉java8的程序员。
Java8中有一些新特性,如lambda、默认方法、静态接口方法、新类型推断系统、流等新实用程序,这些特性将对API的设计产生重大影响;它们不适用于较旧的java;保持与较旧的java的兼容性对API设计者来说是一个手铐。
现在跳上Java8马车的好处是,你的API会更现代,没有旧版java的负担。这将在未来(不是很远的)得到回报。
发布于 2015-05-18 20:38:47
由于java.util.function只包含功能接口,因此您可以使用它的“后端”。backport当然不能提供默认函数,只定义接口,但这些接口是添加与Java 8兼容性所需的全部。
streamsupport是一个后端口,它添加的不仅仅是接口,但它避免了名称冲突,不应该要求您进行两个单独的版本。
要使用此方法,如果使用streamsupport,只需编写
import java8.util.function.*;而不是
import java.util.function.*;编辑:mmm-util-backport-java.util.function需要使用-Xclassbootpath,因为它定义了java.util.function,而不是用不同的名称定义相同的东西,所以streamsupport是更好的选择。
发布于 2015-05-18 20:12:46
我的失败了--这对'java.‘’不起作用。packages
一个脏技巧是提供供应商接口,就像Java8中定义的那样,这样你就可以发布一个“java.util.function.Supplier”。
如果客户端不是Java 8之前的版本,那么这可能会使您的实现中的依赖项饱和。
当客户端在Java8上时,JRE优先于类路径,并且将使用“真正的”实现。
如果它不仅仅是一个接口,我很想让占位符类抛出一个错误,如果它曾经被使用过。
不过,您需要在Java8JRE之前的版本上测试包封性。我认为情况并非如此。
我在一些大型项目中偶然看到过这种方法,在这些项目中添加了包含“java.‘”的jar。或者“javax.”在它们被合并到JRE之前的包(例如JSR jars)。在功能成为JRE的一部分很久之后,这些功能就已经运行了很长时间。
更新:
如下所述,类加载器在非JRE的“java.*”包上停滞不前,所以我一定是记错了遗留的碎片(除非在1.3/1.4之前没有强制执行规则?)。
也许对“java.lang.reflect.Proxy”进行一些凌乱的工作可能会取得结果--但这几乎不是一个透明的解决方案。
https://stackoverflow.com/questions/30288717
复制相似问题