我有一个方法,它需要一个超类的列表(特别是我的类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()
返回对象僵尸的列表。僵尸扩展了暴徒。
但是,这行代码:
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>)
不能向使用上限通配符指定的List
添加除null
以外的任何内容。 List<? extends Mob>
可以是任何扩展Mob
。 对于编译器来说,这可能是一个List<Mafia>
。 您不应该能够向可能是List<Mafia>
的List
添加Zombie
。 为了保持类型安全,编译器必须阻止此类调用。
若要添加到此类列表,必须删除通配符。
public static void spawnMob(Mob mob, List<Mob> mobs){
如果可能必须使用特定子类传入List
,请考虑使该方法泛型:
public static <T extends Mob> void spawnMob(T mob, List<T> mobs){
尝试使用 List<Mob> mobs
.
你可以将列表声明为 List<Mob> mobs
,并且 Mob
的任何子类都将被接受。请注意,当您从列表中获取项目时,您只能确定它们属于 Mob
类型。您必须进行一些测试以查看它是什么类型。
只需将生物列表创建为
List<Mob> mobs;