没有实现接口的所有方法

时间:2015-01-28 22:00:46

标签: java eclipse java-8 comparator

我尝试在eclipse上复制代码below。我收到一个错误,告诉我必须实现所有继承的方法(因为Comparator是一个接口)。

  

类型new Comparator(){}必须实现继承的抽象方法Comparator.reversed()

有很多这些方法,我唯一想要覆盖的方法就是比较。我是否必须实施所有其他方法,或者有没有办法指定我不需要实施它们? 我understand由于界面的契约性质,我必须这样做,但是如果我只需要改变一种方法呢?

static Map sortByValue(Map map) {
     List list = new LinkedList(map.entrySet());
     Collections.sort(list, new Comparator() {
          public int compare(Object o1, Object o2) {
               return ((Comparable) ((Map.Entry) (o1)).getValue())
              .compareTo(((Map.Entry) (o2)).getValue());
          }
     });

    Map result = new LinkedHashMap();
    for (Iterator it = list.iterator(); it.hasNext();) {
        Map.Entry entry = (Map.Entry)it.next();
        result.put(entry.getKey(), entry.getValue());
    }
    return result;
} 

修改 通过在eclipse luna中将遵从性级别更改为java8来解决。谢谢!

5 个答案:

答案 0 :(得分:17)

  

类型new Comparator(){}必须实现继承的抽象方法Comparator.reversed()然后如果我应用修复,我添加了许多函数

Comparator.reversed是在Java 1.8中引入的,它是default method,即您 必须覆盖的方法。

在使用Java 1.8 API时,您的合规性级别似乎已设置为Java 1.8之前(因为Eclipse要求您覆盖reversed)(因为Comparator具有reversed方法)。

确保将您的API更改为1.7 将您的合规性级别更改为1.8 。 (后一种选择需要Eclipse Luna或更好。)

有关Eclipse合规性级别的更多信息:  What is "compiler compliance level" in Eclipse?

答案 1 :(得分:5)

这是一个疯狂的猜测:我认为你在Java 8-Eclipse之前使用Java 8(即前Luna)。这样,Eclipse就不知道所有那些新的Comparator方法(如thenComparing)都有默认实现。

In Java 7,Comparator只有方法compare,而in Java 8 in有更多方法,所有方法都直接在接口中有默认实现,不需要在子类中实现。

我建议您切换到Eclipse的最新版本,应该是Luna。或者,您也可以为Eclipse Kepler安装补丁,但切换到Luna肯定会更好。

答案 2 :(得分:1)

接口的目的是强制所述接口的实现者拥有其中列出的所有方法。现在有几种方法可以避免实现所有方法。

  1. 对于您不希望实施的每种方法(支持),只需抛出UnsupportedOperationException。这种实现的一个例子是Collections API
  2.   

    为了保持核心集合接口的数量可管理,Java平台不为每个集合类型的每个变体提供单独的接口。 (这些变体可能包括不可变,固定大小和仅附加。)相反,每个接口中的修改操作都被指定为可选 - 给定的实现可以选择不支持所有操作。如果调用了不受支持的操作,则集合将抛出UnsupportedOperationException。实现负责记录它们支持哪些可选操作。所有Java平台的通用实现都支持所有可选操作。

    1. 或者您可以遵循Java开发人员对一些声明许多方法的接口所做的事情,例如:MouseAdapter。这样你就可以实现每一种方法,但它们不会做任何有用的事情。

答案 3 :(得分:0)

抽象类可能更适合您正在做的事情。虽然你可以只.super()一切。

答案 4 :(得分:0)

您遇到了Eclipse错误: https://bugs.eclipse.org/bugs/show_bug.cgi?id=390889

基本上,JAVA 1.8引入了一种全新的方法Comparator.reversed()。由于你有一个JAVA 1.7或更早版本的代码,JAVA 1.8找不到该方法并且无法编译。