オブジェクトの.equals(Object)
javadocに記載されています:
これは対称的です: null 以外の参照値 x と y の場合、y.equals(x) が true を返す場合に限り、x.equals(y) は true を返す必要があります。
コード例のほぼすべての場所で、最初のテストの 1 つとして.equals(Object)
使用するオーバーライドされたメソッドを目にします。instanceof
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-generating-equals
Person a = new Person(), b = new SpecialPerson();
a.equals(b); //sometimes true, since b instanceof Person
b.equals(a); //always false
たぶん、SpecialPerson のスーパーへの equals 直接呼び出しの先頭に追加する必要がありますか?
public boolean equals(Object obj) {
if( !obj instanceof SpecialPerson )
return super.equals(obj);
...
/* more equality tests here */
}