没有实现接口的所有方法
Not implementing all the methods of an interface
我尝试在 eclipse 上重现代码 below。我收到一条错误消息,告诉我必须实现所有继承的方法(因为 Comparator 是一个接口)。
The type new Comparator(){}
must implement the inherited abstract method 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 来解决。谢谢!
摘要 class 可能更适合您的工作。虽然你可以 .super()
一切。
The type new Comparator(){}
must implement the inherited abstract method Comparator.reversed()
then if I apply the fix, I have many functions added
Comparator.reversed
是在 Java 1.8 中引入的,它是一个 default method 即你 不必 覆盖的方法。
您似乎已将合规级别设置为 Java 1.8 之前(因为 Eclipse 要求您覆盖 reversed
),同时使用 Java 1.8 API(因为 Comparator
有一个 reversed
方法)。
确保您将您的 API 更改为 1.7 或 将您的合规级别更改为 1.8。 (后一个选项需要 Eclipse Luna 或更好的软件。)
有关 Eclipse 合规性级别的更多信息:
What is "compiler compliance level" in Eclipse?
这是一个大胆的猜测:我认为您在 Java 8-Eclipse 之前(即 Luna 之前)中使用 Java 8。这样,Eclipse 就不知道所有那些新的 Comparator 方法,如 thenComparing
,都有一个默认实现。
In Java 7, Comparator has just the method compare
, while in Java 8里面的方法多了很多,所有的方法都直接在接口中有默认实现,不需要在子类中实现。
我建议你切换到最新版本的Eclipse,应该是Luna。或者,您也可以为 Eclipse Kepler 安装补丁,但切换到 Luna 肯定更好。
接口的目的是强制所述接口的实现者拥有其中列出的所有方法。现在有几种方法可以避免实现所有方法。
- 对于您不想实现(支持)的每个方法,只需抛出 UnsupportedOperationException. An example of this sort of implementation would be the Collections API。
To keep the number of core collection interfaces manageable, the Java platform doesn't provide separate interfaces for each variant of each collection type. (Such variants might include immutable, fixed-size, and append-only.) Instead, the modification operations in each interface are designated optional — a given implementation may elect not to support all operations. If an unsupported operation is invoked, a collection throws an UnsupportedOperationException. Implementations are responsible for documenting which of the optional operations they support. All of the Java platform's general-purpose implementations support all of the optional operations.
- 或者您可以按照 Java 开发人员对一些声明了很多方法的接口所做的操作,例如:MouseAdapter。这样您将实现每个方法,但它们不会做任何有用的事情。
您 运行 遇到了一个 Eclipse 错误:
https://bugs.eclipse.org/bugs/show_bug.cgi?id=390889
基本上,JAVA 1.8 引入了一个全新的方法Comparator.reversed()。并且由于您有 JAVA 1.7 或更早的代码,JAVA 1.8 找不到该方法并且无法编译。
我尝试在 eclipse 上重现代码 below。我收到一条错误消息,告诉我必须实现所有继承的方法(因为 Comparator 是一个接口)。
The type
new Comparator(){}
must implement the inherited abstract methodComparator.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 来解决。谢谢!
摘要 class 可能更适合您的工作。虽然你可以 .super()
一切。
The type
new Comparator(){}
must implement the inherited abstract methodComparator.reversed()
then if I apply the fix, I have many functions added
Comparator.reversed
是在 Java 1.8 中引入的,它是一个 default method 即你 不必 覆盖的方法。
您似乎已将合规级别设置为 Java 1.8 之前(因为 Eclipse 要求您覆盖 reversed
),同时使用 Java 1.8 API(因为 Comparator
有一个 reversed
方法)。
确保您将您的 API 更改为 1.7 或 将您的合规级别更改为 1.8。 (后一个选项需要 Eclipse Luna 或更好的软件。)
有关 Eclipse 合规性级别的更多信息: What is "compiler compliance level" in Eclipse?
这是一个大胆的猜测:我认为您在 Java 8-Eclipse 之前(即 Luna 之前)中使用 Java 8。这样,Eclipse 就不知道所有那些新的 Comparator 方法,如 thenComparing
,都有一个默认实现。
In Java 7, Comparator has just the method compare
, while in Java 8里面的方法多了很多,所有的方法都直接在接口中有默认实现,不需要在子类中实现。
我建议你切换到最新版本的Eclipse,应该是Luna。或者,您也可以为 Eclipse Kepler 安装补丁,但切换到 Luna 肯定更好。
接口的目的是强制所述接口的实现者拥有其中列出的所有方法。现在有几种方法可以避免实现所有方法。
- 对于您不想实现(支持)的每个方法,只需抛出 UnsupportedOperationException. An example of this sort of implementation would be the Collections API。
To keep the number of core collection interfaces manageable, the Java platform doesn't provide separate interfaces for each variant of each collection type. (Such variants might include immutable, fixed-size, and append-only.) Instead, the modification operations in each interface are designated optional — a given implementation may elect not to support all operations. If an unsupported operation is invoked, a collection throws an UnsupportedOperationException. Implementations are responsible for documenting which of the optional operations they support. All of the Java platform's general-purpose implementations support all of the optional operations.
- 或者您可以按照 Java 开发人员对一些声明了很多方法的接口所做的操作,例如:MouseAdapter。这样您将实现每个方法,但它们不会做任何有用的事情。
您 运行 遇到了一个 Eclipse 错误: https://bugs.eclipse.org/bugs/show_bug.cgi?id=390889
基本上,JAVA 1.8 引入了一个全新的方法Comparator.reversed()。并且由于您有 JAVA 1.7 或更早的代码,JAVA 1.8 找不到该方法并且无法编译。