2016-11-09 46 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)

Add方法在類型列表中是不適用的參數(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'類型的列表中。 因此,您必須將列表的類型更新爲與「傳遞」或「傳遞」類型相同,以與列表的類型相同。

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

你可以編輯你的答案補充解釋_why_這個解決OP的問題呢?僅有代碼的答案往往不太有用。 –

相關問題