java 如何在Object类的参数上调用自定义类的方法?[duplicate]

8zzbczxx  于 2023-01-24  发布在  Java
关注(0)|答案(2)|浏览(133)

此问题在此处已有答案

Java type casting problems when overrideing equals()(1个答案)
昨天关门了。
我写了一个类Statistician,它有一个检查对象是否相等的方法。这个方法equals(Object obj)调用Statistician类mean()中的另一个方法。下面是equals(Object obj)的简化版本,它只使用mean()检查一个字段是否相等。

public boolean equals(Object obj) {
    if (obj == null || obj.getClass() != Statistician.class) {
        return false;
    }

    if (obj.mean() != this.mean()) {
        return false;
    }

    return true;
}

问题是在obj上调用mean()是一个语法错误,我不知道如何解决这个问题,根据我的任务,我必须将obj作为Object类传递,而不是作为Statistician类传递。
我试着编译上面的代码,但收到了语法错误。

k2arahey

k2arahey1#

Java不会让你调用Object类型的引用上的Statistician类的方法,毕竟,如果引用指向的对象碰巧不是Statistician,那么obj.mean()到底是什么意思呢?
是的,你的眼球/大脑可以告诉:但是,可以肯定的是,你刚刚检查了它的getClass(),它必须是,但是java lang规范不允许你这样做,一般的方法是基本的类型转换:
在第一个IF块之后:Statistician other = (Statistician) obj;,从那里可以调用other.mean()

mm9b1k5b

mm9b1k5b2#

一旦完成了类型检查,就可以自信地将对象强制转换为正确的类型。

Statistician statistician = (Statistician)obj;

那以后打电话都用statistician,而不是obj
另外,应该使用instanceof来进行类型检查,而不是getClass,后者用于更高级的反射技术。

if (!(obj instanceof Statistician)) {
    return false;
}

如果你曾经子类化过Statistician,这仍然是有效的。即使Statistician是final,这仍然是比为如此简单的东西而陷入反射更可读的版本。这有一个额外的副作用,即删除了null检查,因为null从来不是instanceof any类型。

相关问题