从类型擦除Java对象获取原始类

时间:2014-07-31 03:48:34

标签: java generics type-erasure raw-types

我有一个对象,我需要为该对象获取Type。我需要从擦除的对象中获取rawType。

例如我有一个班级

class Blah{}

class Dummy extends Blah{}

class A<T extends Blah>
{
}

i create a instance for A like this new A<Dummy>().

我需要获取创建对象的原始类型,我看到Apache有TypeUtils getRawClass。但它需要一个java Type。我有实际的实例,但我如何从中得到Type。做object.getClass()似乎没有帮助,原始类型没有恢复。希望得到一些意见。

编辑: 感谢您的回复,就像下面的答案我找不到任何方法来获得实际类型。保留该类型的唯一建议是使用超类型令牌。 http://gafter.blogspot.com/2006/12/super-type-tokens.html

2 个答案:

答案 0 :(得分:4)

  

我有实际的实例,但我如何从

获取Type

由于泛型类型擦除,这是不可能的。

在运行时,实例没有其泛型类型的记录。

有关更多讨论,请参阅此other thread

答案 1 :(得分:0)

正如@Thilo所建议的那样,通用信息可在编译时获得。如果你需要它,那么你必须将它存储在对象本身的某个地方。

示例代码:

class A<T extends Blah> {

    private Class<T> type;

    public A(Class<T> type) { // class must be exactly same as type of object
        this.type = type;
    }

    public Class<T> getType() {
        return type;
    }
}

...

A<Dummy> a = new A<Dummy>(Dummy.class); // only Dummy.class is the valid argument
System.out.println(a.getType().getName());   // com.x.y.z.Dummy

...
A<Dummy> a = new A<Dummy>(Blah.class); // not valid, compile time error
A<Dummy> a = new A<Dummy>(Dummy2.class); // not valid, compile time error
A<Dummy> a = new A<Dummy>(XYZ.class); // not valid, compile time error