Как компаратор может быть функциональным интерфейсом, когда он имеет два абстрактных метода? [дубликат]
этот вопрос уже есть ответ здесь:
в 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.