我正在尝试覆盖equals方法。 由于某种原因,我们的教授将对象参数转换为类型类(计数器)。
有人可以向我解释其背后的逻辑吗?如果我代替“算计那个=(反)其他”;只需删除该行并将“ that.count”更改为“ other.count”,它就可以执行。
public class Counter {
private int count;
public Counter() {
count = 2;
}
public boolean equals(Counter other) {
if(other instanceof Counter) {
Counter that = (Counter) other;
return (this.count == that.count);
}
else {
return false;
}
}
public static void main(String args []) {
Counter casio = new Counter();
Counter texas = new Counter();
System.out.println(casio.equals(texas));
}
}
答案 0 :(得分:3)
equals方法的签名错误。为了覆盖该方法,它需要具有类型Object
的参数:
@Override
public boolean equals(Object other) {
这需要您将other
强制转换为Counter
并进行instanceof
检查,否则您将无法访问count
字段。
答案 1 :(得分:2)
强制转换的原因是equals
方法的实现者要使用类Counter
的字段,即字段count
。
因为传递给方法的参数other
的类型为Object
。因此,编译器不知道它实际上是Counter
对象。通过类型转换,您可以告诉编译器您确定该对象实际上是Counter
实例。
然后,编译器允许您使用其定义的成员,例如count
。
请注意,转换可以通常在运行时抛出ClassCastException
,但是由于首先由instanceof
运算符检查对象的类型,因此可以确保该对象是实际上是一个Counter
实例,因此这样做是安全的。
当我们已经使用instanceof
检查类型时,为什么必须进行显式类型转换?之所以必须进行此显式转换,是因为instanceof
是运行时检查。强制转换是一个编译时断言。
boolean equals(Counter other)
?那是因为然后您将重载Object的equals方法,而不是重写。
答案 2 :(得分:0)
没有逻辑……除了在equals方法签名中可能存在错误之外。这里的equals是从Object类继承的equals方法的重载。
定义equals方法的 right 方法是重写equals方法继承的表单对象。</Edit>
在这种情况下,强制性转换