次のコードが機能しない理由を理解していないため、答えが基本的なものと関連していると思います。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
のタスクを知っている場合、その最後のステートメントのナイフの配列リストを渡すのはなぜ大丈夫ですか?
私は正確な答えは分かりませんが、2番目の例でできることは 'public void interfaceIsTheArgument(ArrayList <?extends Weapon>)です。それは動作します。 – fge