Как компаратор может быть функциональным интерфейсом, когда он имеет два абстрактных метода? [дубликат]

этот вопрос уже есть ответ здесь:

в 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.