它在 Object 的.equals(Object)
javadoc 中说明:
它是对称的:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应该返回 true。
在示例代码的几乎所有地方,我都看到了用作第一个测试之一的覆盖.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
in 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 直接调用 super 的开头添加?
public boolean equals(Object obj) {
if( !obj instanceof SpecialPerson )
return super.equals(obj);
...
/* more equality tests here */
}