Не применяя все методы интерфейса

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

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

Есть много таких методов, и единственное, что я хочу переписать, - это сравнение. Нужно ли мне выполнять все другие методы или есть способ указать, что мне не нужно их реализовывать? Я понимаю, что мне придется это делать из-за контрактного характера интерфейса, но что, если мне просто нужно изменить один метод?

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. Спасибо!

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

Ответ 5

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

В принципе, JAVA 1.8 представил новый метод Comparator.reversed(). А поскольку у вас есть JAVA 1.7 или более ранний код, JAVA 1.8 не находит этот метод и не компилируется.