2013-12-15 40 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