【问题标题】:Not implementing all the methods of an interface没有实现接口的所有方法
【发布时间】:2015-03-28 00:02:27
【问题描述】:

我尝试在 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 来解决。谢谢!

【问题讨论】:

  • 不确定你在说什么。编译得很好。
  • 您确定在您的代码中根本不应该使用任何类型的泛型吗?这适用于 Java 1.4 吗?
  • @mbomb007,你意识到 OP 已经在他的帖子中链接到这个问题了吗?
  • 这是一个疯狂的猜测:我认为您在 Java8 之前的 Eclipse(即 Luna 之前)中使用 Java8。所以 Eclipse 并不知道所有这些新的 Comparator 方法,比如 thenComparing,都有一个 default 实现。

标签: java eclipse java-8 comparator


【解决方案1】:

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

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?

【讨论】:

  • 刚刚对此进行了测试,至少在 Luna 中,符合级别 1.7 的项目使用 1.8 JDK 构建良好,并且不需要实现所有这些方法...
  • 好的。无论如何,这样的设置对我来说似乎很糟糕。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    接口的目的是要求该接口的实现者必须拥有其中列出的所有方法。现在有几种方法可以解决不实现所有方法的问题。

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

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

    1. 或者您可以按照 Java 开发人员对声明大量方法的某些接口所做的操作,例如:MouseAdapter。这样,您将实现所有方法,但它们不会做任何有用的事情。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 不是指实现接口的抽象类吗?
      • 不,我的意思是把它重写为一个抽象类,这样你就可以选择实现什么。我相信 java swing 有这样的事件监听器解决方案,我只是不记得他们叫什么
      • 你能举个例子吗? (我应该把超级放在哪里?)
      • 适配器类就是所谓的
      • 来自我在一本书中读到的内容。您应该有一个实现接口的抽象类,但从长远来看,您必须稍后在某个地方实现所有功能,希望它有意义
      【解决方案5】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-11
        • 2015-12-05
        • 1970-01-01
        • 2011-02-10
        • 1970-01-01
        • 2011-03-10
        • 2014-06-02
        • 1970-01-01
        相关资源
        最近更新 更多