将子类对象添加到超类列表

时间:2014-02-19 22:34:58

标签: java list

我有一个获取超类列表的方法(特别是我的类Mob)。它看起来像这样:

List<? extends Mob> mobs

我希望能够添加任何将超类Mob扩展到此列表的对象,如下所示:

spawnMob(new Zombie(World.getInstance(), 0, 0), World.getInstance().getZombies());

这是有问题的方法:

public static void spawnMob(Mob mob, List<? extends Mob> mobs){
    mobs.add(mob);
}

这行代码World.getInstance().getZombies()返回对象Zombie的List。僵尸扩展了Mob。

然而,这行代码:

mobs.add(mob);

引发此错误:

The method add(capture#1-of ? extends Mob) in the type List<capture#1-of ? extends Mob> is not applicable for the arguments (Mob)

我该怎么做才能解决这个问题?

编辑,将方法更改为除List<Mob>以外我收到此错误:

The method spawnMob(Mob, List<Mob>) in the type MobSpawner is not applicable for the arguments (Zombie, List<Zombie>)

4 个答案:

答案 0 :(得分:4)

除了null之外,您无法向使用上限通配符指定的List添加任何内容。 List<? extends Mob>可以是任何扩展Mob的内容。对于所有编译器都知道它可能是List<Mafia>。您应该无法将Zombie添加到可能是List的{​​{1}}。为了保护类型安全,编译器必须阻止此类调用。

要添加到此类列表,您必须删除通配符。

List<Mafia>

如果您可能必须传递具有特定子类的public static void spawnMob(Mob mob, List<Mob> mobs){ ,请考虑使该方法具有通用性:

List

答案 1 :(得分:1)

尝试使用List<Mob> mobs

答案 2 :(得分:1)

您只需将列表声明为List<Mob> mobs,即可接受Mob的任何子类。请注意,当您从列表中获取项目时,您只能确定它们属于Mob类型。你必须做一些测试才能看出它是什么类型。

答案 3 :(得分:0)

只需创建小怪列表

List<Mob> mobs;