oop Java继承:超类被具有不同签名的子类函数“覆盖”
我对我的Java非常生疏,我在以下方面遇到了困难:
public abstract class Animal implements Comparable<Animal> {
//enum stored elsewhere
AnimalType type = null;
private specificCompare(Animal a){
return 0;
}
@Override
public int compareTo(Animal a){
int comp = type.compareTo(a.type);
if (comp > 0) {
return 1;
} else if (comp < 0) {
return -1;
} else {
return specificCompare(a);
}
}
}
public class Mammal extends Animal {
private mammalStuff;
public Mammal(){
...
}
public specificCompare(Mammal m){
//do specific comparison
}
}
所以,我理解为什么哺乳动物的specificCompare没有被称为(不正确的类型),但我正试图找出一种干净的方法来实现这一点。我希望能够扩展这个动物,并让它在需要时正确地调用特定的比较
除了实际答案之外,如果有人建议我阅读相关文档,我很乐意提供链接
# 1 楼答案
重写父函数并将动物参数强制转换为哺乳类或任何特定的子类
当您知道两个对象的类型相同时,才调用specificCompare(请参阅:Animal.compareTo),这样就不会失败
# 2 楼答案
重写方法意味着签名完全相同。签名由名称及其参数组成。您
Mammal
类没有重写specificCompare(Animal a)
它正在定义一个新函数如果你想在哺乳动物中显式调用这个函数,你必须在动物体内执行类似
specificCompare((Mammal) a)
的操作,然后它会找到正确的签名。但这显然是不可取的只需精确匹配签名,使其覆盖,然后测试
a
是否为哺乳动物。如果它是铸造它,并按照你的逻辑。如果不是,你可能应该抛出一个ClassCastException
# 3 楼答案
根据您的评论进行编辑
好吧,在我看来,如果你只是想比较类型,而不知道它们的具体类,你只能得到像
Animal
一样精确的结果,而不需要强制转换它们。这是因为这是所有动物之间最具体的共同联系。您可以做的是在Animal
中提供一个抽象方法,它具有某种价值在
Mammal
类中,它可能如下所示:通过对传递给您的对象调用
returnType
,您可以了解传递给您的对象的独特之处,而不必知道它们的实例类型,也不必强制转换