Java .equals() 子类的实例?为什么不称超类为相等,而不是让它成为最终的呢?
它在Object的javadoc中陈述:.equals(Object)
它是对称的:对于任何非空引用值 x 和 y,x.equals(y) 应返回 true 当且仅当 y.equals(x) 返回 true。
在示例代码中,几乎在任何地方我都看到被覆盖的方法,它用作首批测试之一,例如在这里:在重写等于和哈希代码时必须考虑哪些问题/陷阱?.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;
我们不保证这是对称的。例如,这里已经讨论过:any-reason-to-prefer-getclass-over-instanceof-when-generating-equals.equals()
Person a = new Person(), b = new SpecialPerson();
a.equals(b); //sometimes true, since b instanceof Person
b.equals(a); //always false
也许我应该在SpecialPerson的平等直接调用超级的开头添加?
public boolean equals(Object obj) {
if( !obj instanceof SpecialPerson )
return super.equals(obj);
...
/* more equality tests here */
}