如何在运行时捕获方法类型(泛型类型)

时间:2013-12-15 13:20:50

标签: java generics

我必须在运行时捕获一些类型。我无法弄清楚如何做到这一点。

棘手的地方是这种类型是通用的。

代码 代码段

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建议。

并添加到main():

    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();

应返回类型返回任何内容。

有什么建议吗?

1 个答案:

答案 0 :(得分:4)

由于类型擦除,运行时类型信息消失了。这里的常见技巧是在构造函数中存储Class T,如下所示:

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
}