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



我有一个方法,它需要一个超类的列表(特别是我的类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;

相关内容

  • 没有找到相关文章

最新更新