我已经看到了这个:
// Returns whether o refers to a Point object with
// the same (x, y) coordinates as this Point object
public boolean equals(Object o) {
if (o instanceof Point) {
Point other = (Point) o;
return x == other.x && y == other.y;
} else {
return false;
}
}
为什么要求equals方法的参数采用Point
对象更为明智(并且更简单)。然后,如果我们尝试将Point与非Point进行比较,那么编译器将捕获它。那不是更好吗?
答案 0 :(得分:4)
因为它不会覆盖Object.equals
,这是许多标准库算法用于检查两个对象相等性的方法。
这些算法中的许多算法可以对不同类型的对象进行操作,因此equals
可以将您的对象与任何其他类的对象进行比较。
答案 1 :(得分:1)
因为这会打破覆盖的第一条规则,并成为equals()
类
Object
方法的重载
方法覆盖规则:
答案 2 :(得分:-1)
您可以在Apache Commons库中简单地使用EqualsBuilder类。 https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/builder/EqualsBuilder.html
public boolean equals(Object obj) {
if (obj == null) { return false; }
if (obj == this) { return true; }
if (obj.getClass() != getClass()) {
return false;
}
MyClass rhs = (MyClass) obj;
return new EqualsBuilder()
.appendSuper(super.equals(obj))
.append(field1, rhs.field1)
.append(field2, rhs.field2)
.append(field3, rhs.field3)
.isEquals();
}
将是
public boolean equals(Object obj) {
return EqualsBuilder.reflectionEquals(this, obj);
}