我有一个关于应用多态性的问题:假设我有一个类Bird,并且我有很多类来扩展它(比如Pigeon、Falcon等等)。接下来,我有一个Cage类。在这节课上,我想列一张住在那个笼子里的鸟的清单(每个笼子里只能有一种鸟)。
正因为如此,我不知道列表的扩展类型(A Pigeon?或者是Eagle?),我唯一知道的就是它将是一个Bird。
Pigeon extends Bird If
使用多态性,我可以将鸟声明为:Bird tom = new Pigeon();而不是Pigeon tom = new Pigeon();
所以为什么我不能在构造函数中初始化这样的东西:.
private List<Bird> birdList;
public Cage() {
this.birdList = new ArrayList<Pigeon>();
/* Instead of birdList = new ArrayList<Bird>(); */
}如果你不能做到这一点,是否有可能以另一种方式实现我的目标?
发布于 2015-04-27 08:25:26
因为在每个笼子里只有一种鸟,所以你可以使用通用类型来键入你的笼子类。
例如,Cage<T>将以这样的方式定义一个鸟类列表:List<T> birdList。
发布于 2015-04-27 08:30:04
你不能这样做:
列表鸟类=新的ArrayList();
在爪哇。左边的通用类型必须是完全相等的(或者不一定是相等的,如果在游戏中有牌??)扩展T还是?超级T)右边的泛型类型。
如果有可能的话,那就不可能把新鹰加入到被宣布为鸟类名单的名单中--这是没有意义的。
你能做的是:
List<Bird> birds = new ArrayList<Bird>();
birds.add(new Pigeon());(Bird的所有家族,包括Pigeon的)
或者:
List<? extends Bird> birds = new ArrayList<Pigeon>();
birds.add(new Pigeon()); // Adding is immpossible now - list can be read only now! 发布于 2015-04-27 08:22:06
您可以添加到您的鸟阵列鸽子,然后测试的实例:
private List<Bird> birdList;
public Cage(){
this.birdList = new ArrayList<>();
birdList.add(new Pidgeon());
//...
//Checking if it is a Pidgeon :
if(birdList.get(i) instanceof Pidgeon) {
//It is a pidgeon
}
}https://stackoverflow.com/questions/29890562
复制相似问题