在Java 8中使用Java 7 Comparators

时间:2014-03-22 02:38:30

标签: java migration osgi java-8

场合

我有一个OSGi项目,我试图迁移到Java 8.在我的项目中,我依赖于第三方库,我和他们一起工作了#34; (只需添加MANIFEST.MF文件并将元数据放入其中)。这些库是从只读的SVN存储库中检出的,因此我可以在需要时检查更新,因此我不想在MANIFEST.MF文件中进行任何其他更改,因为我不能提交它们。

问题

但是,这些库使用了许多匿名比较器,如:

private static final Comparator heightComparator = new Comparator() {
    public int compare (Object o1, Object o2) {
        return ((Glyph)o1).getHeight() - ((Glyph)o2).getHeight();
    }
};

现在,显然java.util.Comparator接口有一大堆需要实现的新方法(当然,这会导致编译错误)。但我真的想避免实现它们或切换到Lambda表达式,因为修改原始源很可能每次检查更新版本时都会导致冲突。

Java过去在向后兼容性方面努力工作,我想知道为什么这么简单且广泛使用的API部分需要(相对)大量迁移。我错过了什么或是否真的不可避免?

3 个答案:

答案 0 :(得分:22)

我有类似thobens的问题:更新了我的Kepler 4.2.3以使用Java 8,将JAVA 8设置为新的JRE等。 就像thobens一样,我在比较器上遇到错误,eclipse要求我实现所有未实现的方法。

最后这是由旧的编译器编译级别(1.7)引起的 - 切换到1.8解决了这个问题。

答案 1 :(得分:9)

Java 8版Comparator中的新方法是默认方法(Java 8中的一项新功能),它不仅包括方法签名,还包括默认实现。因此,较旧的Comparator实现应该可以在Java 8上正常工作(如果它们之前有效)。

如果某些内容无效,请告诉我们您的尝试以及错误消息。

答案 2 :(得分:0)

发生这种情况是因为java 7 Comparator没有所有其他方法,当你将Eclipse更新为Java 1.8时,为了使用Comparator需要新的方法来解决这个问题,只需将编译器更改回Java 1.7( properties - Java Compiler --- JDK Compliance),刷新你的项目..希望这个帮助