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

use*_*633 2 java list

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

List<? extends Mob> mobs
Run Code Online (Sandbox Code Playgroud)

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

spawnMob(new Zombie(World.getInstance(), 0, 0), World.getInstance().getZombies());
Run Code Online (Sandbox Code Playgroud)

这是有问题的方法:

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

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

然而,这行代码:

mobs.add(mob);
Run Code Online (Sandbox Code Playgroud)

抛出这个错误:

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

我可以做什么来解决这个问题?

编辑,将方法更改为 except 后,List<Mob>我​​收到此错误:

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

rge*_*man 5

除了使用上限通配符指定null之外,您不能添加任何内容。ListAList<? extends Mob>可以是任何延伸的东西Mob。这可能是List<Mafia>所有编译器都知道的。您不应该能够将 a 添加ZombieList可能是 a 的 a 中List<Mafia>。为了保持类型安全,编译器必须阻止此类调用。

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

public static void spawnMob(Mob mob, List<Mob> mobs){
Run Code Online (Sandbox Code Playgroud)

如果您可能必须传入List具有特定子类的 s,请考虑使该方法通用:

public static <T extends Mob> void spawnMob(T mob, List<T> mobs){
Run Code Online (Sandbox Code Playgroud)