【发布时间】:2017-05-20 10:30:06
【问题描述】:
假设我有一个基本的动物课程
abstract class Animal {
// basic animal code
}
现在我有两种不同的动物...
public class Dog extends Animal{
// dog code
}
和
public class Bird extends Animal implements Flyable{
// bird code
@Override
public void fly() {
System.out.println("flap flap");
}
}
Flyable 是一个包含单个方法的简单接口:
public void fly();
如果我有一个动物列表,我想循环遍历它,告诉鸟儿飞,但让狗独自一人,我怎么能做到这一点?
public class Test {
public static List<Animal> animals = new ArrayList<Animal>();
public static void main(String[] args) {
animals.add(new Bird("flop"));
animals.add(new Dog("plop"));
for(Fly f : animals) { // exception here because of mismatch of types
f.flap();
}
}
}
到目前为止,我发现的唯一选择是使用 instanceof 来确定一个类是否实现了 Flyable 接口,但快速的谷歌搜索表明这对业务不利。 来源如: https://www.quora.com/Is-using-instanceof-in-Java-consider-bad-practice-Any-alternative-to-using-this-keyword 将 instanceof 的使用视为糟糕的设计。
我觉得有一种我以前见过的直观方法可以做到这一点,但找不到好的解决方案。
【问题讨论】:
标签: java list generics interface instanceof