它在 Object 中声明.equals(Object)
javadoc:
它是对称的:对于任何非空参考值 x 和 y,
当且仅当 y.equals(x) 返回时 x.equals(y) 才应返回 true
真的。
在示例代码中几乎所有地方我都看到被覆盖.equals(Object)
使用的方法instanceof
作为第一个测试,例如这里:重写 equals 和 hashCode 时必须考虑哪些问题/陷阱? https://stackoverflow.com/questions/27581/overriding-equals-and-hashcode-in-java
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()
是对称的。
例如,这里已经讨论过:任何理由在生成等于时更喜欢 getclass 而不是实例 https://stackoverflow.com/a/596507/2622016
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 */
}