我使用一个库,其中抽象类使用抽象方法覆盖从Object
继承的具体方法:
public abstract class A {
@Override
public abstract boolean equals(Object obj);
}
要扩展此类,我必须实现equals
方法:
public class B extends A {
@Override
public boolean equals(Object obj) {
return obj != null && obj.getClass() == B.class;
}
}
为什么抽象方法(A::equals
)会覆盖具体方法(Object::equals
)?我没有看到这个目标。
答案 0 :(得分:24)
在这个具体的例子中,它非常有意义。如果要在集合中使用A的子类,其中equals
被广泛用于定位对象,那么使A
的{{1}}方法抽象强制您提供非默认实现equals
的任何子类中equals
的{{1}}(而不是使用仅比较实例引用的Object类的默认实现)。
当然,您在B中建议的A
实现没有多大意义。您应该比较2 B实例的属性以确定它们是否相等。
这是一个更合适的实现:
equals
此外,请务必在覆盖public class B extends A {
@Override
public boolean equals(Object obj) {
if (!(obj instanceof B))
return false;
B other = (B) obj;
return this.someProperty.equals(other.someProperty) && this.secondProperty.equals(other.secondProperty);
}
}
时覆盖hashCode
(因为equals
和equals
的合同要求hashCode
然后{{1} }})。
答案 1 :(得分:10)
因为在这种情况下,您希望您的对象定义自己的equals
,据说其行为与默认实现不同。
您不应将此视为删除功能,而应强制继承对象实现自己的功能。
答案 2 :(得分:6)
这将允许您强制子类重新实现方法。这是否是一个好主意是另一回事。如果您想要执行比提供的原始方法更强的合同,您只会这样做。然后,您应该仔细记录新合同。
答案 3 :(得分:3)
这意味着您必须实施您自己的equals()
方法
答案 4 :(得分:1)