我有一个获取超类列表的方法(特别是我的类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>)
答案 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;