Не реализует все методы интерфейса

Я попытался воспроизвести код ниже на затмение. Я получаю сообщение об ошибке, сообщающее мне, что я должен реализовать все унаследованные методы (потому что Comparator-это интерфейс).

тип new Comparator(){} должен реализовать унаследовал абстрактный метод Comparator.reversed().

существует много этих методов, и единственный, который я хочу перезаписать, - это compare. Должен ли я реализовать все другие методы или есть способ указать, что мне не нужно реализовывать их? Я!--12-->понять что мне придется это сделать из-за контрактной природы интерфейса, но что, если мне просто нужно изменить один метод?

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;
} 

редактировать Решается путем изменения уровня соответствия java8 в eclipse luna. Спасибо!

5 ответов


тип new Comparator(){} должен реализовать унаследовал абстрактный метод Comparator.reversed() тогда, если я применю исправление, у меня добавлено много функций

Comparator.reversed был введен в Java 1.8 и это метод по умолчанию т. е. метод, который вы не придется переопределить.

похоже, что у вас установлен уровень соответствия pre Java 1.8 (так как Eclipse просит вас переопределить reversed), при использовании Java 1.8 API (начиная с Comparator есть reversed метод).

убедитесь, что вы либо измените свой API на 1.7 или измените уровень соответствия на 1.8. (Последний вариант требует Eclipse Luna или лучше.)

подробнее об уровне соответствия Eclipse: что такое "уровень соответствия компилятора" в Eclipse?


это своего рода дикая догадка: я думаю, вы используете Java 8 в pre-Java 8-Eclipse (т. е. pre-Luna). Таким образом, Eclipse не знает, что все эти новые методы компаратора, такие как thenComparing, имеет реализацию по умолчанию.

В Java 7, компаратор имеет только метод compare, а в Java 8 В имеет много методов, каждый из которых имеет реализацию по умолчанию непосредственно в интерфейсе и не должны быть реализованы в производный класс.

Я предлагаю вам переключиться на новейшую версию Eclipse, которая должна быть Луна. Кроме того, вы также можете установить патч для Eclipse Kepler, но переход на Luna, безусловно, лучше.


цель интерфейса состоит в том, чтобы обязать исполнителя указанного интерфейса иметь все перечисленные там методы. Теперь есть несколько способов, чтобы получить о не реализации всех методов.

  1. для каждого метода, который вы не хотите реализовать (поддержка), просто бросьте UnsupportedOperationException. Примером такого рода реализации может служить API коллекций.

чтобы сохранить количество ядер управляемые интерфейсы коллекции, платформа Java не предоставляет отдельные интерфейсы для каждого варианта каждого типа коллекции. (Такие варианты могут включать неизменяемый, фиксированный размер и только добавление.) Вместо этого операции модификации в каждом интерфейсе назначаются необязательными - данная реализация может выбрать не поддерживать все операции. Если вызывается неподдерживаемая операция, коллекция создает исключение UnsupportedOperationException. Реализация отвечает за документирование того, какой из дополнительные операции, которые они поддерживают. Все универсальные реализации платформы Java поддерживают все дополнительные операции.

  1. или вы можете следить за тем, что разработчики Java сделали с некоторыми интерфейсами, которые объявляют много методов, например:MouseAdapter. Таким образом, вы будете реализовывать каждый метод, но они не будут делать ничего полезного.

абстрактный класс может быть лучше подходит для того, что вы делаете. Хотя вы могли бы просто .super() все.


вы столкнулись с ошибкой Eclipse: https://bugs.eclipse.org/bugs/show_bug.cgi?id=390889

в основном, JAVA 1.8 представила совершенно новый компаратор методов.реверсированный.)( И поскольку у вас есть JAVA 1.7 или более ранний код, JAVA 1.8 не находит метод и не компилируется.