Я пытаюсь написать библиотеку интерфейсов коллекции, которые реализуют большинство методов в стандартном API Collection, используя новый синтаксис метода по умолчанию в Java 8. Вот небольшой пример того, что Я иду:Ошибка Java 8: наследование интерфейса Аннотация и по умолчанию
public interface MyCollection<E> extends Collection<E> {
@Override default boolean isEmpty() {
return !iterator().hasNext();
}
//provide more default overrides below...
}
public interface MyList<E> extends MyCollection<E>, List<E> {
@Override default Iterator<E>iterator(){
return listIterator();
}
//provide more list-specific default overrides below...
}
Однако даже этот простой пример встречается с ошибкой компилятора:
error: interface MyList<E> inherits abstract and default
for isEmpty() from types MyCollection and List
из моего понимания методов по умолчанию, то это должно быть разрешено, так как только один из удлиненных интерфейсы обеспечивают реализацию по умолчанию, но ap это не так. Что тут происходит? Есть ли способ заставить это делать то, что я хочу?
Необходимость дублирования всех этих сигнатур методов разочаровывает, но это похоже на то, что я искал. Принято, полагая, что избежать этого невозможно. –
В самом деле, это плохо, потому что нет никаких оснований для того, чтобы 'List' обновлял' isEmpty() '. Единственная цель - изменить комментарий к документации из унаследованного «Возвращает true, если эта коллекция не содержит элементов». Более конкретно «Возвращает true, если этот список не содержит элементов». Без этого все будет работать по-прежнему, но ошибка компиляции из этого вопроса исчезнет, поскольку 'MyCollection.isEmpty()' переопределяет 'Collection.isEmpty()' ... – Holger
@Holger. Вы правы в этом случае. Но для других методов, таких как 'toArray', документация отличается больше с точки зрения контракта метода. Я думаю, что эта проблема возникает как цена за использование методов по умолчанию. – manouti