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

В 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 является одним из этих методов, "количество абстрактных методов" интерфейса по-прежнему 1.

Также из FunctionalInterface страница документации:

Если интерфейс объявляет абстрактный метод, переопределяющий один из открытых методов java.lang.Object, это также не учитывается в счетчике абстрактного метода интерфейса, поскольку любая реализация интерфейса будет иметь реализацию из java.lang.Object или в другом месте. [акцент мой]

поскольку equals это публичный метод Object это утверждение применимо; таким образом, для Comparator только compare Метод способствует подсчету абстрактного метода.

Другие известные методы, к которым применяется это правило: toString а также hashCode,

Другие вопросы по тегам