我试图在抽象类中覆盖equals方法。有没有办法可以检查参数Object o
是否是继承了该方法的类的实例,然后将类型转换为与继承了equals方法的类相同的类型?
这是我到目前为止所尝试的,但我收到的类型为java.lang.Object
的错误变量。有没有理由认为o没有被强制转换? getOperand()
method返回复合类型。
@Override
public boolean equals(Object o){
if (o.getClass() == this.getClass()){
this.getClass().cast(o);
return (o.getOperand().equals(this.getOperand()));
}
else {
return false;
}
}
答案 0 :(得分:2)
你需要:
getOperand
方法,因为Object
类没有这样的方法。 equals
方法比较operand
值,而不是使用==
。 instanceof
以使解决方案支持混合类型相等。 (阅读Liskov Substitution Principle。如果您不想支持混合类型相等,则可选)将equals
方法标记为final
,以防止子类覆盖它以支持对称性(如果x.equals(y)
然后y.equals(x)
。如果不支持混合,则不需要类型相等)
public abstract class EqualsTest {
public final boolean equals(Object o) {//make equals final to maintain symmetry
if (o instanceof EqualsTest) {//use instanceof
EqualsTest e = (EqualsTest)o;//cast and assign to EqualTest reference
return e.getOperand().equals(this.getOperand());//use equals here
} else
return false;
}
}
}
通过上述更改,子类可以按原样继承equals方法:
class EqualsTestSubClass extends EqualsTest {
//inherts the equals and getOperand methods.
}
class EqualsTestSubClass2 extends EqualsTestSubClass {
//inherts the equals and getOperand methods.
}
然后,您可以检查EqualsTestSubClass
实例的相等性,EqualsTest
实例是EqualsTestSubClass2
和EqualsTestSubClass
实例的直接子类,它是EqualsTest e1 = new EqualsTestSubClass();
EqualsTest e2 = new EqualsTestSubClass2();
System.out.println(e1.equals(e2));
实例的子类,如下所示:
operand
注意:最好直接比较equals
方法中的getOperand
字段,而不是使用getOperand
,因为np.sqrt(7131 ** 5)
是np.sqrt(7132 ** 5)
重写。