2016-11-09 7 views
1

タイプ(T)を取得するジェネリッククラスを作成しようとしています。このタイプ(T)から継承したオブジェクトを追加するためのリストとメソッドが含まれます。制限付きの型パラメータを使用してリストにオブジェクトを追加する

public abstract class Vehicle<P> { 
    List<? extends P> passengers = new ArrayList<>(); 
    public <T extends P> void addPassenger(T pass){ 
     passengers.add(pass);//error 
    } 
} 

しかし、私はマークされた行でエラーが出ます:

方法が追加(キャプチャ#1-のPを拡張?)タイプのリストでは、引数には適用されません(P)

これを正しく行うにはどうすればよいですか?

答えて

2

これは、この

public class Vehicle<P> { 

    List<P> passengers = new ArrayList<>(); 

    public <T extends P> void addPassenger(T pass) { 
     passengers.add(pass); 
    } 
} 

のように行うことができますが、我々は乗客を追加することができ、今追加します。

A a = new A("a"); // A superclass 
    B b = new B("b"); // B extends A 
    C c = new C("c"); // C extends B 
    D d = new D();  // not extending A 

    Vehicle<A> vehicle = new Vehicle<>(); 
    vehicle.addPassenger(a); 
    vehicle.addPassenger(b); 
    vehicle.addPassenger(c); // passenger of type A,B and C can be added 
    vehicle.addPassenger(d); // !ERROR: passenger of type D can't be added. 
+0

ここで 'T'は無意味です。これは 'public void addPassenger(P pass)'とまったく同じです。 – newacct

1

しようとしているのは、タイプ 'T'のパスを 'Pを拡張するタイプ'のリストに追加することです。 したがって、Listのタイプを 'pass'と同じにするか、 'pass'のタイプをListのタイプと同じにする必要があります。

public abstract class Vehicle<T> { 
    List<T> passengers = new ArrayList<>(); 
    public void addPassenger(T pass){ 
    passengers.add(pass); 
    } 
} 
+1

あなたは、これはOPの問題を解決_why_説明を追加するにはあなたの答えを編集することはできますか?コードのみの回答はあまり役に立たない傾向があります。 –

関連する問題