为什么我们要在java中将对象类型强制转换为类类型?

为什么我们要在java中将对象类型强制转换为类类型?,java,class,object,casting,Java,Class,Object,Casting,我正在尝试覆盖equals方法。 出于某种原因,我们的教授将对象参数强制转换为类型类计数器 有人能给我解释一下背后的逻辑吗?如果我代替了Couter,那=反对方;只需删除该行并将该.count更改为其他.count,即可正常执行 public class Counter { private int count; public Counter() { count = 2; } public boolean equals(Counter othe

我正在尝试覆盖equals方法。 出于某种原因,我们的教授将对象参数强制转换为类型类计数器

有人能给我解释一下背后的逻辑吗?如果我代替了Couter,那=反对方;只需删除该行并将该.count更改为其他.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));
    }
}

equals方法的签名错误。要重写该方法,它需要具有Object类型的参数:


这需要您强制转换其他计数器并执行instanceof检查,否则无法访问计数字段。

没有逻辑。。。除了equals方法签名中可能有错误这一事实。这里equals是从对象类继承的equals方法的重载

定义equals方法的正确方法是重写从对象继承的equals方法

public boolean equals(Object other) {
      if(other instanceof Counter) {
        Counter that = (Counter) other;
        return (this.count == that.count);
      }
      else {
          return false;
      }
}

在这种情况下,强制转换是必需的

强制转换之所以必要,是因为equals方法的实现者希望使用类计数器的字段,即字段计数

因为传递给该方法的另一个参数的类型为Object。因此,编译器不知道它实际上是一个计数器对象。通过typecast,您可以告诉编译器您确信该对象实际上是一个计数器实例

然后,编译器允许您使用其定义的成员,例如count

打字总是安全的吗? 请注意,强制转换通常可以在运行时抛出ClassCastException,但由于instanceof操作符首先检查对象的类型,因此可以保证该对象实际上是一个计数器实例,因此这样做是安全的

为什么显式强制转换是必要的? 当我们已经用instanceof检查类型时,为什么需要显式类型转换?之所以需要显式转换,是因为instanceof是一个运行时检查。强制转换是一种编译时断言

但为什么不只是布尔等式呢? 这是因为您正在重载对象的equals方法,而不是重写


哎呀,只是一个小错误,问题现在就要解决了,谢谢!。这就回答了问题。如果other有类型对象,那么没有类型转换,equals方法将无法编译。如果不转换,则无法编译。如果other是一个对象,则它没有用于比较的count字段。@user472288是,因为该方法参数已经是Counter类型。但是它没有履行客体的契约。你的情况正好是这样。但是,如果您将计数器放入列表中,然后在列表中调用contains,您将找不到它。但是instanceof不是已经验证了此检查并确保该对象实际上是计数器对象吗?@user472288是的,这就是为什么可以安全地强制转换请参见edit.Argh。。但是,如果我们验证这是一个计数器对象,为什么我们不能在不首先强制转换对象参数的情况下访问count字段呢?抱歉,我对此感到困惑。我已回滚上次编辑,因为它使接受的答案无效,并使问题无意义。否,接受的答案更正了我的错误,并回答了更正的问题。可能对什么是问答有误解,因为现在您的equals方法签名没有错误以避免混淆,我将选择一个不同的答案,在我的更正后发布,如果这更适合。为避免混淆,请不要用您的问题编辑使答案无效
public boolean equals(Object other) {
      if(other instanceof Counter) {
        Counter that = (Counter) other;
        return (this.count == that.count);
      }
      else {
          return false;
      }
}