出于培训目的,我正在创建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
}
在这种情况下,我希望猫只吃一只老鼠。我不能吃它让我们说斑马。
答案 0 :(得分:2)
您可以在界面中使用泛型来帮助进行类型检查。
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) {
}
}
我在Carnovorous
Cat
只吃Rodents
。
答案 1 :(得分:1)
您可以提供食肉动物可以吃的界面。
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;
}