0

我对我的 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
    }
}

所以,我理解为什么没有调用 Mammal 的 specificCompare (类型不正确),但我正试图找出一种干净的方法来完成这项工作。我希望能够扩展 Animal 并让它在需要时正确调用特定的比较。

除了实际答案之外,如果有人建议我阅读此文档,我将很乐意提供指向它的链接。

4

3 回答 3

3

覆盖父函数并将 Animal 参数转换为 Mammal 或任何特定的子类。

public class Mammal extends Animal {
    private mammalStuff;

    public Mammal(){
        ...
    }

    public int specificCompare(Animal a){
       Mammal m = (Mammal)a;
       //do specific comparison
    }

当您知道两个对象是相同类型时,您只会调用 specificCompare(请参阅:Animal.compareTo),因此这不会失败。

于 2013-05-12T22:17:13.973 回答
2

编辑以回应您的评论

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

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

Mammal课堂上,它可能看起来像这样:

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

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

于 2013-05-12T22:16:05.093 回答
0

覆盖方法意味着签名完全相同。签名由名称及其参数组成。您Mammal的课程不会覆盖specificCompare(Animal a)它正在定义一个新功能。

如果您想在 Mammal 中显式调用该函数,则必须specificCompare((Mammal) a)在 Animal 内部执行类似操作,然后它会找到正确的签名。这显然是不希望的。

只需完全匹配签名,以便它覆盖它,然后测试是否a是哺乳动物。如果它被投射并按照你的逻辑进行。如果不是,您可能应该抛出一个ClassCastException

于 2013-05-12T22:20:01.020 回答