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

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

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

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

ИЗМЕНИТЬ Решено изменением уровня соответствия на java 8 в eclipse luna. Спасибо!

11
giulio 29 Янв 2015 в 01:00

5 ответов

Лучший ответ

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

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

0
sankalpn 28 Янв 2015 в 22:16

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

0
an earwig 28 Янв 2015 в 22:04

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

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

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

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

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

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

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

5
tobias_k 28 Янв 2015 в 22:10