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

Почему в java.util.Comparator нет равных значений?

Как в Javadoc, так и в коде, интерфейс Comparator определяет:

 int compare(T o1, T o2);
 boolean equals(Object obj);

Но тогда это не дает никаких компиляций:

 Comparator a = new Comparator() {      
     @Override public int compare(Object o1, Object o2) {
        //..
     }
 };

Но это делает:

 Comparator a = new Comparator() {      
     @Override public boolean equals(Object comparator) {
        //..
     }
 };

Как это делается для интерфейса, позволяющего нам не переопределять метод?

4b9b3361

Ответ 1

Прежде всего JavaDocs объяснит, что вы должны реализовать этот метод:

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

Но позже:

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

Как можно не переопределить equals(), хотя это часть интерфейса? Поскольку этот метод уже реализован для каждого объекта в Java (в Object классе).

Объявление в интерфейсе должно только подчеркнуть важность equals() в отношении Comparator путем добавления дополнительных объяснений JavaDoc.

Кстати, если ваш компаратор без гражданства, у вас должен быть только один экземпляр - в этом случае реализация по умолчанию equal() просто прекрасна.

Ответ 2

Beczuse каждый объект уже реализует equals().

В действительности указание equals() снова в определении интерфейса компаратора ничего не делает, кроме как давая возможность документировать контракт и его связь с compareTo().