2013-12-15 39 views
2

我必須在運行時捕捉類型。我無法弄清楚如何做到這一點。如何在運行時捕捉方法類型(generick類型)

棘手的地方是,這種類型是通用的。

代碼片段:

public class Ship<T> { 

    private ArrayList<T> passangers = new ArrayList<T>(); 

    public Ship(ArrayList<T> passangers) { 
     this.passangers = passangers; 
    } 

    public void addPassanger(T object) { 
     passangers.add(object); 
    } 
    // ... rest of class 
} 

如何捕捉哪種類型爲方法addPassanger(T object)在運行時。 趕上這種類型的T

更新:

我跟着dasblinkenlight建議。

並添加到主():

Ship<Droid> victoria = new Ship<Droid>(new ArrayList<Droid>(), Droid.class); 

    victoria.addPassanger(new Droid("Christofor Columb")); 
    victoria.addPassanger(new Droid("Fernando Magelan")); 
    victoria.addPassanger(new Droid("James Kuk")); 

    System.out.print("Passengers type is:"); 
    victoria.getPassengerType(); 
    System.out.println(); 
    victoria.showPassangers(); 

但是輸出旁邊:

Passengers type is: 
At the sheep are presented: 
1 Christofor Columb 
2 Fernando Magelan 
3 James Kuk 

這裏行:

victoria.getPassengerType();

哪個應該返回類的類型什麼都不返回。

有什麼建議嗎?

+0

爲什麼你需要知道的類型? –

+1

object.getClass()可以做到這一點,但它不一定會返回代碼本身定義的類型,這會在編譯類型中被擦除。無論如何,你可能有一個設計缺陷。嘗試避免特定類型檢查以確定您的流量。 –

回答

4

由於類型擦除,運行時,類型信息消失。這裏的常見的伎倆是的TClass存儲在構造函數中,像這樣:

public class Ship<T> { 

    private final Class<T> passengerType; 
    private ArrayList<T> passengers = new ArrayList<T>(); 

    public Sheep(ArrayList<T> passengers, Class<T> passengerType) { 
     this.passengers = passengers; 
     this.passengerType = passengerType; 
    } 

    public void addPassenger(T object) { 
     passengers.add(object); 
    } 
    // ... rest of class 
} 
+0

我試圖調用這個新的構造函數'Ship victoria = new Ship (new ArrayList (),Droid.class);'和'getPassengerType()'調用它時什麼也不返回? –

+0

@nazar_art這可能意味着您在構造函數的標題中錯誤輸入了'passengerType',所以'this.passengerType = passengerType'是該字段賦值給它自己的。在構造函數的末尾設置斷點,並檢查是否已分配'this.passengerType'。 – dasblinkenlight