Как 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
,