Я хочу знать, почему интерфейс .compareTo()
находится в Comparable
интерфейсе, а метод like .equals
- в Object
классе. Мне кажется произвольным, почему такой метод .compareTo()
уже не в Object
классе.
Чтобы использовать .compareTo()
, вы реализуете Comparable
интерфейс и реализуете .compareTo()
метод для ваших целей. Для .equals()
метода вы просто переопределяете метод в своем классе, так как все классы наследуются от Object
класса.
Мой вопрос: почему метод похож .compareTo()
на интерфейс, который вы реализуете, а не на класс Object
? Аналогично, почему .equals()
метод в классе, Object
а не в каком-то интерфейсе, должен быть реализован?
java
language-design
interfaces
Wesley
источник
источник
Eq
класса типов).Ответы:
Не все объекты можно сравнивать, но все объекты можно проверить на равенство. Если ничего другого, то можно увидеть, существуют ли два объекта в одном и том же месте в памяти (равенство ссылок).
Что это значит для
compareTo()
двухThread
объектов? Как один поток "больше" другого? Как вы сравниваете дваArrayList<T>
с?Object
Договор относится ко всем классам Java. Если даже один класс нельзя сравнить с другими экземплярами его собственного класса, онObject
не может требовать, чтобы он был частью интерфейса.Джошуа Блох использует ключевые слова «естественный порядок», когда объясняет, почему класс может захотеть реализовать
Comparable
. Не каждый класс имеет естественный порядок, как я упоминал в моих примерах выше, поэтому не каждый класс должен реализовывать иComparable
не долженObject
иметьcompareTo
метод.Эффективная Java, второе издание : Джошуа Блох. Пункт 12, стр. 62. Эллипсы удаляют ссылки на другие главы и примеры кода.
Для случаев , когда вы действительно хотите , чтобы наложить упорядочение на не-
Comparable
класса , который не имеет естественный порядок, вы всегда можете поставитьComparator
экземпляр для помощи разбирайтесь.источник
==
для последнего, это имеет полое кольцо к нему. Независимо от избыточного значения по умолчанию, можно найти веские причины не приниматьequals
во внимание все классы, поскольку не все типы могут поддерживать отношение эквивалентности.==
», потому что то, как создаются эти классы, является деталью реализации, но язык делает невозможным скрытие. Можно сказать, что любой, кто сравнивает дваInteger
с помощью ссылки, - идиот, но позволить сравнение с самого начала еще глупее.В ПСБ §4.3.2 определяет, какой
class
объект следующим образом:Итак, вот почему
equals
вObject
ноcompareTo
в отдельном интерфейсе. Я бы предположил, что они хотят сохранитьObject
как можно меньше. Они, вероятно, полагали, что почти всемObjects
понадобитсяequals
иhashCode
(что на самом деле является просто формой проверки на равенство), но не все объекты должны иметь концепцию упорядочения , для чегоcompareTo
и используется.источник
Equitable<T>
но еслиObject
его реализовать, то каждый класс будетEquitable<Object>
. На этом этапе есть разница? В действительности не очень, по сложности да.object
имеетEquals(object)
, как и в Java, но есть такжеIEquatable<T>
интерфейс. Хотя основная причина его существования заключается в том, чтобы избегать бокса, когдаT
это тип значения, что невозможно в Java.equals
он объявленObject
напрямую:The methods equals and hashCode are declared for the benefit of hashtables such as java.util.Hashtable (§21.7)
- как дизайн Java является обратно совместимым, выбор дизайна Java 1.0 является реальной причинойequals
того, где он находится.В дополнение к отличному ответу Snowman, помните, что
Comparable
это был общий интерфейс в течение долгого времени. Тип не реализуетcompareTo(object)
, он реализует,compareTo(T)
гдеT
это его собственный тип. Это не может быть реализованоobject
, такobject
как не знает класс, который будет производным от него.object
мог бы определитьcompareTo(object)
метод, но это позволило бы не только то, на что указывает Снеговик, сравнение между двумяArrayList<T>
s или между двумяThread
s, но даже сравнение между aArrayList<T>
и aThread
. Это еще более бессмысленно.источник
Предположим, у меня есть две ссылки на объект: X идентифицирует экземпляр
String
содержания «Джордж»; Y идентифицирует экземплярPoint
удержания координат [12,34]. Рассмотрим следующие два вопроса:X и Y идентифицируют эквивалентные объекты?
Должен ли X сортироваться до, после или эквивалентно Y?
Тот факт, что X и Y идентифицируют экземпляры несвязанных типов, не представляет никаких проблем при рассмотрении первого вопроса. Объекты могут считаться эквивалентными, только если их типы имеют общую базу, которая определяет их как эквивалентные; так как
String
и неPoint
имеют такой базы (их единственный общий базовый тип рассматривает все различные объекты как неэквивалентные), ответ просто «нет».Однако тот факт, что типы не связаны между собой, создает огромную проблему в отношении второго вопроса. Некоторые типы определяют отношения упорядочения среди своих экземпляров, а некоторые отношения упорядочения могут даже распространяться на несколько типов [например, было бы возможно
BigInteger
иBigDecimal
определить методы сравнения, которые позволили бы ранжировать экземпляры одного типа относительно экземпляров другого], но в общем случае невозможно взять два произвольных экземпляра и спросить «Должен ли X сортировать до, после или эквивалентен Y» и получить полное упорядочение. Можно было бы спросить «Должен ли X сортировать до, после, эквивалентный или не оцененный по отношению к Y», требуется ли объектам сообщать о последовательном упорядочении, хотя и не об общемодин, но большинство алгоритмов сортировки требуют полного упорядочения. Таким образом, даже если бы все объекты могли реализоватьcompareTo
метод, если «unranked» был допустимым возвращением, такой метод не был бы достаточно полезен, чтобы оправдать его существование.источник