缩小实现中的参数范围



出于训练目的,我正在创建Java项目来保存有关动物的信息。有一个抽象类动物,其他人将扩展。

我想创建食肉界面,通常将任何动物作为论据:

    public interface Carnivorous {
        public void eatAnimal(Animal animal);
    //alternative way I have tried
        public <T extends Animal> void eatAnimal2( T animal);
    }

问题是,在具体的实现中,我想将其缩小到扩展 Animal 的特定类:

public class Cat extends Animal implements Carnivorous {

public Cat(String name, int expierence, String meow) {
    super(name, expierence);
    this.meow = meow;
}
public String getMeow() {
    return meow;
}
public void setMeow(String meow) {
    this.meow = meow;
}
@Override
public String toString() {
    return "Cat [meow=" + meow + ", name=" + name + ", expierence=" + expierence + "]";
}
@Override
public void eatAnimal(Animal animal) {
    // TODO Auto-generated method stub
}
@Override
public <T extends Animal> void eatAnimal2(T animal) {
    // TODO Auto-generated method stub
}

在这种情况下,我只想让猫吃老鼠。我不是为了能够吃东西,比如说斑马。

您可以在接口中使用泛型来帮助进行类型检查。

public static class Animal {
    public Animal() {
    }
}
public static class Rodent extends Animal {
    public Rodent() {
    }
}
public interface Carnivorous<A extends Animal> {
    public void eatAnimal(A animal);
}
public class Cat extends Animal implements Carnivorous<Rodent> {
    @Override
    public void eatAnimal(Rodent r) {
    }
}

在这里,我有一个只吃Rodents Carnovorous Cat.

你可以提供一个食肉动物可以吃的界面。

public interface Carnivorous {
    public void eatAnimal(Animal animal);
    //alternative way I have tried
    public <T extends Animal> void eatAnimal2( T animal);
    Set<Class<? extends Animal>> canEat();
}

并实施,然后检查食肉动物是否可以吃提供的动物。

public Set<Class<? extends Animal>> canEat() {
        //TODO can be moved out of method 
        Set<Class<? extends Animal>> classes = new HashSet<Class<? extends Animal>>();
        classes.add(Mouse.class);
        return classes;
    }

最新更新