Компаратор FunctionalInterface имеет 2 абстрактных метода
Изучение Java 8 Lambdas и просто интересно, как компилятор знает, какой метод в Компараторе использовать для выражения лямбда?
Кажется, это не интерфейс SAM? Он имеет 2 абстрактных метода:
@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
}
Ответы
Ответ 1
equals()
не является абстрактным методом. Этот метод переопределяет Object.equals(Object)
и доступен только для интерфейса Comparator, чтобы иметь возможность подключать javadoc к методу, объясняя, как компараторы должны реализовывать equals()
.
Смотрите javadoc of FunctionalInterface:
Если интерфейс объявляет абстрактный метод, переопределяющий один из общедоступных методов java.lang.Object, это также не учитывает счет абстрактного метода интерфейса, поскольку любая реализация интерфейса будет иметь реализацию из java.lang.Object или в другом месте.
Ответ 2
equals() наследуется от Object, а унаследованные открытые методы не учитываются при определении, является ли интерфейс функциональным интерфейсом. Таким образом, несмотря на то, что equals() является абстрактным в Comparator, поскольку он наследуется, он не считается.
ПРАВИЛО: Функциональный интерфейс - это интерфейс, который имеет один абстрактный метод. Методы по умолчанию не учитываются; статические методы не учитываются; и методы, унаследованные от Object, не учитываются.
Ответ 3
Все классы происходят от класса Object, и Object содержит равный метод.
Таким образом, это означает, что каждый экземпляр, который реализует Comparator, уже будет иметь реализацию равного метода.
Поэтому только один метод требуется переопределить с помощью класса Implanting интерфейса Comparator.
Это делает только один абстрактный метод в интерфейсе Comparator
Вот почему Comparator является функциональным интерфейсом
Ответ 4
equals() не считается абстрактным методом, поскольку он присутствует в классе Object.
В Java каждый класс расширяет объект по умолчанию.
Любой класс, реализующий Comparator, будет иметь тело метода для equals() по умолчанию. Так что не обязательно перезаписывать его
Вот почему считается, что класс Comparator имеет только один абстрактный метод.
Вы можете прочитать больше на Почему Comparator является интерфейсом SAM даже с 2 absract методом?