Подтвердить что ты не робот

Почему компаратор объявляет равные?

Интерфейс компаратора имеет свой собственный метод equals(). Любой класс получит equals() по умолчанию через класс Object. В чем необходимость использования метода equals() внутри интерфейса?

4b9b3361

Ответ 1

Comparator уточняет контракт Object.equals: он должен удовлетворять ограничениям, установленным Object.equals, а затем некоторым.

Кроме того, этот метод может возвращать true, только если указанный объект также является компаратором, и он налагает тот же порядок, что и этот компаратор. Таким образом, comp1.equals(comp2) подразумевает, что sgn(comp1.compare(o1, o2))==sgn(comp2.compare(o1, o2)) для каждой ссылки объекта o1 и o2.

Объявление equals внутри Comparator позволяет вам документировать это в форме javadoc.

Обратите внимание, что документация API также служит контрактом, поэтому здесь не просто косметика. Это явные ограничения, на которые может положиться другой код и ваш код.

В подобных ситуациях, когда у вас есть менее установленные методы, он может также служить документированием намерения. I.e., Interface.method должен быть там, независимо от того, как развиваются его суперинтерфейсы.

Ответ 3

Прочтите javadoc. Это там только для объяснения того, что equals() должен вернуться, если вы решите переопределить его в классе, реализующем Comparator. Вы можете подумать, что ни один компаратор не может быть равным никому другому, но это не так. Вы можете подумать, что два компаратора равны, если они возвращают одно и то же для любых аргументов, но это не так. В javadoc объясняется, что два компаратора равны, если они налагают одинаковый порядок, независимо от аргументов. Джавадок также говорит:

Обратите внимание, что всегда безопасно не переопределять Object.equals(Object)

В большинстве случаев вы не переопределяете equals() в компараторах.

Ответ 4

из docs:

всегда безопасно не переопределять Object.equals(Object). Однако переопределение этого метода может в некоторых случаях повысить производительность, позволяя программам определять, что два отдельных компаратора налагают один и тот же порядок.

Ответ 5

Помещение метода Object в объявление интерфейса позволяет Javadoc декларация о значении равенства должна иметь в классах, которые реализовать интерфейс.

Ответ 6

Технически декларация метода избыточна (компилятору все равно), но...

Объявление метода equals в этом интерфейсе делает его частью контракта между вызывающим и различными компараторами и позволяет ему указать/расширить его семантику.

Указывает, что два компаратора равны, только если они накладывают одинаковый порядок с помощью метода compare(). Это расширяет семантику Object.equals() и поэтому должна быть документирована в интерфейсе.

Ответ 7

Метод equals() в Comparator предоставляется для принудительного выполнения пользователем интерфейса Comparator для реализации equals() с некоторыми дополнительными правилами и ограничениями в дополнение к тем, которые уже применяются на equals() от Object.

Дополнительное правило:

Этот метод должен подчиняться общему контракту Object.equals(Object). Кроме того, этот метод может возвращать true, только если указанный объект также является компаратором и налагает тот же порядок, что и этот компаратор. Таким образом, comp1.equals(comp2) подразумевает, что sgn (comp1.compare(o1, o2)) == sgn (comp2.compare(o1, o2)) для каждого ссылка на объект o1 и o2.

Ответ 8

Comparator interface have their own equals() method

Ну,. прежде всего, должно быть ясно, что всякий раз, когда вы реализуете интерфейс Comparable, вы должны предоставить своей программе решение, когда объекты равны, меньше или больше.

I am quite confuse about have equals() inside Comparator. Any class will get equals() by default through Object class.

Реализация метода equals() u, наследуемая от класса Object, проверяет, указывают ли эти два реферала на один и тот же объект или нет. Он не применяет никакого сравнения. Это вы предоставите в своем классе (или, возможно, в вашем интерфейсе) критерии для равных объектов.

Then what is need to have equals() method inside an interface?

Очевидно, что всякий раз, когда вы реализуете, когда объекты меньше, больше, чем вы должны реализовать, когда они равны. поэтому вместо того, чтобы полагаться на метод Object equals() по умолчанию, вы должны указать свою логику для проверки равенства