Вызов foo.equals(bar)
спрашивает: «Считаете ли вы себя эквивалент объекта, указанный в этой ссылке? " В отличие от этого, foo.compareTo(bar)
спрашивает: «Должны ли вы поддерживаться выше или ниже объекта, указанного в этой ссылке?»
Любой объект должен иметь возможность ответить на первый вопрос, если ему заданы какие-либо ссылки. Если экземпляр Cat
получил ссылку на FordPickupTruck
и спросил, эквивалентен ли он, ему не нужно ничего знать о классе FordPickupTruck
или о любых его случаях, кроме того, что экземпляр для одного не является экземпляром Cat
, чтобы знать, что он не эквивалентен объекту, определенному данной ссылкой.
Второй вопрос, напротив, обычно имеет смысл при сравнении объектов одного и того же типа. Класс CalendarEvent
может определять CompareTo
так, что события, которые произошли или произойдут раньше, будут сортироваться до более поздних событий, тогда как класс Person
может определить CompareTo
, чтобы люди были ранжированы по алфавиту по имени. В то время как объект Person
не имеет проблем с определением того, был ли он эквивалентен конкретному объекту CalendarEvent
(он просто ответил бы отрицательным), вероятно, не было бы никакого значимого способа, с помощью которого он мог бы сказать, следует ли его сортировать до или после такой объект.
Различные методы для разных целей. –
Примечание для равных вам понадобится реализация hashCode! – StackFlowed
@StackFlowed Не нужно «(говорит адвокат дьявола); хотя это не определено также, нарушает договор Объекта. – user2864740