我無法理解爲什麼以下不起作用,我相信答案與基本的東西有關,我不理解並希望有人可以提供幫助。ArrayList和接口繼承的泛型類型的問題
我瞭解使用接口在ArrayList
這樣的,如果我有:
public interface Weapon { ... }
public class Gun implements Weapon { ...}
public class Knife implements Weapon { ... }
然後你可以插入任何實現武器到武器的數組:
ArrayList<Weapon> weapons = new ArrayList<Weapon>();
weapons.add(new Gun());
weapons.add(new Knife();
我得到的,但是讓我困惑的是理解爲什麼ArrayList<Gun>
與其他方式不兼容ArrayList<Weapon>
。爲了說明,以下是合法的:
public void interfaceIsTheArgument(Weapon w) { ... }
...
interfaceIsTheArgument(new Gun());
interfaceIsTheArgument(new Knife());
但下面的不是:
public void interfaceIsTheArgument(ArrayList<Weapon> w) { ... }
...
interfaceIsTheArgument(new ArrayList<Gun>());
interfaceIsTheArgument(new ArrayList<Knife>());
,因爲過去的函數調用報告,該方法並不適用於它的參數。
我的問題是爲什麼如果該方法知道它的任務ArrayList
與接口作爲泛型類型,爲什麼在這最後一個語句中傳遞一個數組列表的刀爲什麼不行?
我不知道確切的答案,但你可以爲你的第二個例子做的是使用'public void interfaceIsTheArgument(ArrayList <?extends Weapon>)''。那可行。 – fge