为什么在Java中将对象类型转换为类类型?

时间:2019-03-01 15:56:08

标签: java class object casting

我正在尝试覆盖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));
 }

}

3 个答案:

答案 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>

在这种情况下,强制性转换