2014-02-19 45 views
2

我有一個方法,需要一個超類(特別是我的類Mob)的列表。它看起來像這樣:將子類對象添加到超類列表

List<? extends Mob> mobs 

我希望能夠加入擴展了超類的羣氓到這個列表中的任何對象,像這樣:

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的列表。殭屍延伸暴民。

然而,這行代碼:

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

爲什麼不定義你的列表,列表' mobs'?您仍然可以將擴展Mob的對象添加到該列表中。 – exception1

回答

2

您不能添加除null之外的任何內容到由上限制通配符指定的List。 A List<? extends Mob>可以是延伸Mob的任何東西。它可能是一個List<Mafia>所有編譯器知道。您應該無法將Zombie添加到List,這可能是List<Mafia>。爲了保持類型安全,編譯器必須阻止這種調用。

要添加到這樣的列表,您必須刪除通配符。

public static void spawnMob(Mob mob, List<Mob> mobs){ 

如果你可能在List s的具體子類來傳遞,然後再考慮使得該方法一般:

public static <T extends Mob> void spawnMob(T mob, List<T> mobs){ 
1

嘗試用List<Mob> mobs

+0

這是有道理的,但我現在收到這個錯誤'MobSpawner類型中的方法spawnMob(Mob,List )不適用於參數(Zombie,List )' – user3316633

+0

不要更改方法,只需更改' '怪物''聲明 –

1

你可以只申報表作爲List<Mob> mobs,以及Mob任何子類會公認。請注意,當您從列表中獲取項目時,只能確定它們屬於Mob類型。你將不得不做一些測試,看看它是什麼類型。

0

只需創建小怪列表,

List<Mob> mobs; 
相關問題