【发布时间】:2013-09-05 16:26:47
【问题描述】:
Object的.equals(Object)javadoc中有说明:
它是对称的:对于任何非空参考值 x 和 y, 当且仅当 y.equals(x) 返回时 x.equals(y) 应该返回 true 真的。
在示例代码中的几乎所有地方我都看到覆盖了 .equals(Object) 方法,该方法使用 instanceof 作为第一个测试之一,例如这里:What issues / pitfalls must be considered when overriding equals and 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-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 */
}
【问题讨论】:
-
在有效的java中讨论了类似的问题。你可以读一下。
-
添加到 Manoose 评论 - Effective Java sais:“避免问题的最简单方法是不要重写 equals 方法,在这种情况下,每个实例都只等于它自己。这是正确的做法如果满足以下任一条件,请执行以下操作:[...] 超类已覆盖 equals,并且从超类继承的行为适用于此类。”
标签: java equals instanceof