Как компаратор может быть функциональным интерфейсом, когда он имеет два абстрактных метода? [дубликат]
этот вопрос уже есть ответ здесь:
в Java 8,@FunctionalInterface
аннотация вводится для обозначения любого интерфейса, который имеет ровно один абстрактный метод в качестве функционального интерфейса. Одной из причин его введения является указание пользователь (программист), который лямбда-выражение может использоваться в контексте функционального интерфейса.
на Comparator
интерфейс помечается @FunctionalInterface
. Но два метода абстрактны.
int compare(T o1, T o2);
и
boolean equals(Object obj);
в документах FunctionalInterface
, это явно упоминается как
концептуально, функциональный интерфейс имеет ровно один абстрактный метод.
не equals
метод не считается абстракция здесь?
2 ответов
в документах также указано:
Если интерфейс объявляет абстрактный метод, переопределяющий один из открытых методов
java.lang.Object
, что также не учитывается в отношении абстрактного метода интерфейса, поскольку любая реализация интерфейса будет иметь реализацию изjava.lang.Object
или в другом месте.
и с equals
является одним из этих методов, "абстрактный метод count" интерфейса по-прежнему равен 1.
и с на FunctionalInterface
страница документация:
если интерфейс объявляет абстрактный метод переопределение одного из общедоступных методов
java.lang.Object
, который также тут не графа к числу абстрактных методов интерфейса, так как любая реализация интерфейса будет иметь реализацию изjava.lang.Object
или в другом месте. [акцент мой]
С equals
- это публичный метод Object
, это утверждение применимо; таким образом, для Comparator
только compare
метод способствует подсчету абстрактного метода.
другие известные методы, к которым применяется это правило, являются toString
и hashCode
.