В Object .equals(Object)
указано: javadoc:
Он симметричен: для любых непустых опорных значений x и y, x.equals(y) должно возвращать true тогда и только тогда, когда y.equals(x) возвращает правда.
Почти везде в примере кода я вижу переопределенный метод .equals(Object)
, который использует instanceof
как один из первых тестов, например здесь: Какие проблемы/ловушки необходимо учитывать при переопределении equals и hashCode?
public class Person {
private String name;
private int age;
public boolean equals(Object obj) {
if (obj == null)
return false;
if (obj == this)
return true;
if (!(obj instanceof Person))
return false;
...
}
}
Теперь с class SpecialPerson extends Person
с equals
:
if (!(obj instanceof SpecialPerson))
return false;
мы не гарантируем, что .equals()
является симметричным.
Здесь обсуждалось здесь: any-reason-to-prefer-getclass-over-instanceof-when-generate-equals
Person a = new Person(), b = new SpecialPerson();
a.equals(b); //sometimes true, since b instanceof Person
b.equals(a); //always false
Может быть, я должен добавить в начало SpecialPerson равный прямой вызов super?
public boolean equals(Object obj) {
if( !obj instanceof SpecialPerson )
return super.equals(obj);
...
/* more equality tests here */
}