Вообще говоря, хотя это не строго выражено в контракте для equals () , объекты не должны считать себя равными другому объекту, который не относится к тому же классу (даже если это подкласс ). Рассмотрим симметричное свойство - если a.equals (b) имеет значение true, то b.equals (a) также должно быть истинным.
Давайте иметь два объекта: foo
класса Super
и bar
класса Sub
, который расширяет Super
. Теперь рассмотрим реализацию equals()
в Super, особенно когда он называется foo.equals(bar)
. Foo знает только, что bar строго типизирована как Object
, поэтому для точного сравнения необходимо проверить, что это экземпляр Super, а если нет, вернуть false. Да, так что эта часть в порядке. Теперь он сравнивает все поля экземпляра и т. Д. (Или независимо от фактической реализации сравнения) и находит их равными. Пока все хорошо.
Однако, согласно договору, он может вернуть true, только если знает, что bar.equals (foo) также вернет true. Поскольку bar может быть любым подклассом Super, неясно, будет ли переопределен метод equals () (и, возможно, будет). Таким образом, чтобы убедиться, что ваша реализация верна, вам нужно написать ее симметрично и убедиться, что два объекта одного класса.
Более фундаментально, объекты разных классов не могут считаться равными - поскольку в этом случае только один из них может быть вставлен в HashSet<Sub>
, например.