此问题在此处已有答案:
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
类传递。
我试着编译上面的代码,但收到了语法错误。
2条答案
按热度按时间k2arahey1#
Java不会让你调用
Object
类型的引用上的Statistician
类的方法,毕竟,如果引用指向的对象碰巧不是Statistician
,那么obj.mean()
到底是什么意思呢?是的,你的眼球/大脑可以告诉:但是,可以肯定的是,你刚刚检查了它的
getClass()
,它必须是,但是java lang规范不允许你这样做,一般的方法是基本的类型转换:在第一个IF块之后:
Statistician other = (Statistician) obj;
,从那里可以调用other.mean()
。mm9b1k5b2#
一旦完成了类型检查,就可以自信地将对象强制转换为正确的类型。
那以后打电话都用
statistician
,而不是obj
。另外,应该使用
instanceof
来进行类型检查,而不是getClass
,后者用于更高级的反射技术。如果你曾经子类化过
Statistician
,这仍然是有效的。即使Statistician
是final,这仍然是比为如此简单的东西而陷入反射更可读的版本。这有一个额外的副作用,即删除了null
检查,因为null
从来不是instanceof
any类型。