2017-02-08 9 views
-1

BがAのサブクラスであることを見て、メソッドのリストにB型の要素を追加できますが、同じメソッドにB型のリストを渡せないのはなぜですか?Javaのジェネリックについての混乱

public class Test { 

    private static void print(List<A> list) { 
     list.add(new B()); 
    } 

    public static void main(String[] args) { 
     List<B> list = new ArrayList<>(); 
     list.add(new B()); 
     print(list); //does not compile 
    } 
} 

class A {} 

class B extends A {} 

class C extends B {} 

答えて

0

一般的に言えば、夕食師のクラスを使用して変数を宣言することです。 あなたがAとしてあなたのリストを持っているBクラスでそれを埋めるために必要

public static void main(String[] args) { 
    List<A> list = new ArrayList<A>(); 
    list.add(new B()); 
    print(list); 
} 

注:

あなたはスーパークラスのインスタントとして子クラスを考慮することができるが、その逆はない

あなたのケースでは、List<A>を受け入れるので、List<A>List<B>にしか送信できません。しかし、List<A>は、Bのインスタンスを含むことができます。

+0

しかし、あなたは 'void print(List )'を宣言でき、それはうまくいくでしょう。 –

+0

@AndyTurnerええ、あなたはそれを行うことができます。しかし 'C'インスタンスを使いたい場合は複雑になることがあります。もちろんそれが意図されていない(すなわち、Bを単離する) – nafas