有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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没有被称为(不正确的类型),但我正试图找出一种干净的方法来实现这一点。我希望能够扩展这个动物,并让它在需要时正确地调用特定的比较

除了实际答案之外,如果有人建议我阅读相关文档,我很乐意提供链接


共 (3) 个答案

  1. # 1 楼答案

    重写父函数并将动物参数强制转换为哺乳类或任何特定的子类

    public class Mammal extends Animal {
        private mammalStuff;
    
        public Mammal(){
            ...
        }
    
        public int specificCompare(Animal a){
           Mammal m = (Mammal)a;
           //do specific comparison
        }
    

    当您知道两个对象的类型相同时,才调用specificCompare(请参阅:Animal.compareTo),这样就不会失败

  2. # 2 楼答案

    重写方法意味着签名完全相同。签名由名称及其参数组成。您Mammal类没有重写specificCompare(Animal a)它正在定义一个新函数

    如果你想在哺乳动物中显式调用这个函数,你必须在动物体内执行类似specificCompare((Mammal) a)的操作,然后它会找到正确的签名。但这显然是不可取的

    只需精确匹配签名,使其覆盖,然后测试a是否为哺乳动物。如果它是铸造它,并按照你的逻辑。如果不是,你可能应该抛出一个ClassCastException

  3. # 3 楼答案

    根据您的评论进行编辑

    好吧,在我看来,如果你只是想比较类型,而不知道它们的具体类,你只能得到像Animal一样精确的结果,而不需要强制转换它们。这是因为这是所有动物之间最具体的共同联系。您可以做的是在Animal中提供一个抽象方法,它具有某种价值

    public int returnType();
    // Abstract method in Animal class.
    

    Mammal类中,它可能如下所示:

    public int returnType()
    {
        // Purely an example.
        return Animal.MAMMAL;
    }
    

    通过对传递给您的对象调用returnType,您可以了解传递给您的对象的独特之处,而不必知道它们的实例类型,也不必强制转换