我尝试在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来解决。谢谢!
答案 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)
接口的目的是强制所述接口的实现者拥有其中列出的所有方法。现在有几种方法可以避免实现所有方法。
为了保持核心集合接口的数量可管理,Java平台不为每个集合类型的每个变体提供单独的接口。 (这些变体可能包括不可变,固定大小和仅附加。)相反,每个接口中的修改操作都被指定为可选 - 给定的实现可以选择不支持所有操作。如果调用了不受支持的操作,则集合将抛出UnsupportedOperationException。实现负责记录它们支持哪些可选操作。所有Java平台的通用实现都支持所有可选操作。
答案 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找不到该方法并且无法编译。