Зачем в Comparator есть метод equals()?
Итак, метод equals() в функциональном интерфейсе Comparator.
Не пойму вот. Вроде бы методы класса Object нельзя определять в интерфейсах (потому что реализация всегда берётся от Object). Но зачем класс Comparator тогда содержит в себе этот метод? Причём, он даже не default!
Исходя из того, что я нашёл в интернете, я решил, что он нужен для сравнения объектов Comparator. Но как мне его реализовывать, если я собираюсь использовать Comparator исключительно с лямбдами?
И ещё вопрос: каким образом в Comparator два не static и не default метода, а он является функциональным интерфейсом (я имею в виду методы compare() и этот злосчастный equals())?
Ответы (1 шт):
equals служит в данном случая для сравнения самих компараторов.
В Comparator equals может возвращать true даже для компараторов разных типов, если они задают одинаковое отношение порядка. Вот цитата из javadoc к equals, который для того и добавлен, чтобы описать это изменение контракта:
Additionally, this method can return true only if the specified object is also a comparator and it imposes the same ordering as this comparator
Реализовывать его необязательно (а случае, если используете лямбды, то и невозможно). Реализация унаследованная из Object (т.е. сравнения по ссылке) подойдет в подавляющем большинстве случаев.
Что касается функциональных интерфейсов и двух абстрактных методов, то public методы из Object не учитываются. Вот цитата из документации:
If an interface declares an abstract method overriding one of the public methods of java.lang.Object, that also does not count toward the interface's abstract method count since any implementation of the interface will have an implementation from java.lang.Object or elsewhere.