Я попытался воспроизвести код ниже о затмении. Я получаю сообщение об ошибке, сообщающее мне, что мне нужно реализовать все унаследованные методы (поскольку 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. Спасибо!
5 ответов
Тип
new Comparator(){}
должен реализовывать унаследованный абстрактный методComparator.reversed()
, тогда, если я применяю исправление, я добавляю много функций
Comparator.reversed
был представлен в Java 1.8, и это метод по умолчанию < / a> т.е. метод, который не нужно переопределять.
Похоже, у вас установлен уровень соответствия до Java 1.8 (поскольку Eclipse просит вас переопределить reversed
) при использовании API Java 1.8 (поскольку Comparator
имеет метод reversed
).
Убедитесь, что вы изменили свой API на 1,7 или изменили уровень соответствия на 1,8 . (Для последнего варианта требуется Eclipse Luna или лучше.)
Подробнее об уровне соответствия Eclipse: Что такое «уровень соответствия компилятора» в Eclipse?
Вы столкнулись с ошибкой Eclipse: https://bugs.eclipse.org/bugs/show_bug.cgi?id=390889
По сути, JAVA 1.8 представила совершенно новый метод Comparator.reversed (). А поскольку у вас есть код JAVA 1.7 или более ранней версии, JAVA 1.8 не находит метод и не компилируется.
Абстрактный класс может лучше подходить для того, что вы делаете. Хотя ты мог бы просто .super()
все.
Назначение интерфейса - обязать разработчика указанного интерфейса иметь все перечисленные там методы. Теперь есть несколько способов избежать реализации всех методов.
- Для каждого метода, который вы не хотите реализовывать (поддерживать), просто введите UnsupportedOperationException. Примером такого рода реализации может быть Collections API.
Чтобы поддерживать управляемость количества основных интерфейсов коллекции, платформа Java не предоставляет отдельные интерфейсы для каждого варианта каждого типа коллекции. (Такие варианты могут включать неизменяемый, фиксированный размер и только добавление.) Вместо этого операции модификации в каждом интерфейсе обозначены как необязательные - данная реализация может выбрать не поддерживать все операции. Если вызывается неподдерживаемая операция, коллекция выдает исключение UnsupportedOperationException. Реализации несут ответственность за документирование поддерживаемых ими дополнительных операций. Все универсальные реализации платформы Java поддерживают все необязательные операции.
- Или вы можете проследить, что разработчики Java сделали с некоторыми интерфейсами, которые объявляют множество методов, например: MouseAdapter. Таким образом вы реализуете все методы, но они не принесут пользы.
Это своего рода дикая догадка: я думаю, что вы используете Java 8 в Eclipse, предшествующем Java 8 (то есть до Luna). Таким образом, Eclipse не знает, что все эти новые методы Comparator, такие как thenComparing
, имеют реализацию по умолчанию.
В Java 7 в Comparator есть только метод compare
, в то время как в Java 8 in имеет гораздо больше методов, все из которых имеют реализацию по умолчанию непосредственно в интерфейсе и не должны быть реализованы в подклассе.
Я предлагаю вам перейти на новейшую версию Eclipse, которой должна быть Luna. В качестве альтернативы вы также можете установить патч для Eclipse Kepler, но переход на Luna, безусловно, лучше.
Похожие вопросы
Связанные вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.