我有一个方法,它接受一个超类的列表(特别是我的类 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)
除了使用上限通配符指定null之外,您不能添加任何内容。ListAList<? extends Mob>可以是任何延伸的东西Mob。这可能是List<Mafia>所有编译器都知道的。您不应该能够将 a 添加Zombie到List可能是 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)
| 归档时间: |
|
| 查看次数: |
5305 次 |
| 最近记录: |