Когда мы реализуем Interface
, мы inject (or accept)
заключаем контракт, определенный интерфейсом.
Equalable
& Hashable
- это два разных договора.Но если мы внимательно посмотрим, то увидим, что оба они зависят друг от друга, что означает, что они являются частью single interface
, что-то вроде EqualableAndHashable
.
Теперь очевидный вопрос:они должны быть частью этого нового EqualableAndHashable
интерфейса или Object
?
Давайте выясним.У нас есть == (equal operator)
для проверки равенства двух объектов.Оператор ==
подтверждает, равны ли значения / ссылки для двух разных примитивов / объектов.Но на это не всегда возможно ответить, просто проверив оператор ==
.
Теперь вопрос заключается в том, должно ли это равенство which is also a contract
вводиться через интерфейсы или часть класса Object?
Если мы посмотрим, мы не можем просто сказать что-то вроде:
TypeX
не гарантирует контракт на равенство.
Он станетхаос, если некоторые типы объектов предлагают равенство, а некоторые нет.Это означает, что объект TypeX
должен соблюдать контракт на равенство, который также справедлив для всех других типов объектов.Таким образом, он не должен вводить равенство из интерфейса, потому что равенство должно быть частью контракта для любого объекта по умолчанию, в противном случае это создаст хаос.
Поэтому нам нужно, чтобы Объекты пришли к реализации equals
.Но он не может реализовать только метод equals
, ему также нужно реализовать метод hashcode
.