在我的程序中,我有动物和花卉抽象类。动物会吃花,但每个动物只能吃某种类型的花(例如,犀牛只吃玫瑰,乌龟只吃郁金香)。

现在,我的代码基本上看起来像这样:

public abstract class Animal {
    abstract boolean eatFlower(Flower f);
}

public class Rhino extends Animal {
    boolean eatFlower(Flower f) {
        if(!(f instanceof Rose)) return false;
        return (f.eaten = true);
    }
}

public class Turtle extends Animal {
    boolean eatFlower(Flower f) {
        if(!(f instanceof Tulip)) return false;
        return (f.eaten = true);
    }
}


我正在使用instanceof来实现这种区分,即每个动物只吃一种花。我想通过将Turtle和Rhino的方法签名分别更改为eatFlower(Tulip t)eatFlower(Rose r)来实现,但是我认为这在Java中是不可能的。

有没有比使用instanceof强制执行此方法更好的方法?

最佳答案

您可以使用泛型。像这样:

public abstract class Animal<T extends Flower> {
    abstract void eatFlower(T f);
}

public class Rhino extends Animal<Rose> {
    void eatFlower(Rose f) {

    }
}

10-06 09:02