我使用一个库,其中抽象类重写继承自的具体方法Object
使用抽象方法:
public abstract class A {
@Override
public abstract boolean equals(Object obj);
}
为了扩展这个类,我必须实现equals
method:
public class B extends A {
@Override
public boolean equals(Object obj) {
return obj != null && obj.getClass() == B.class;
}
}
为什么抽象方法(A::equals
)覆盖具体方法(Object::equals
)?我看不到这样做的目标。
在这个具体的例子中,这是完全有道理的。如果 A 的子类要在集合中使用,其中equals
被广泛用于定位物体,使得A
's equals
方法抽象强制您提供非默认实现equals
在任何子类中A
(而不是使用仅比较实例引用的 Object 类的默认实现)。
当然,您建议的实施equals
B 中没有什么意义。您应该比较 2 个 B 实例的属性以确定它们是否相等。
这是一个更合适的实现:
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
and hashCode
要求如果a.equals(b) == true
then a.hashCode() == b.hashCode()
).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)