确定Java泛型的运行时类型

时间:2013-12-26 16:07:20

标签: java generics reflection runtime

我有一个泛型类,它有一个需要知道运行时类型的方法:

public class SomePOJO<TYPE> {
    // ... lots of code

    public void doSomething() {
        // Obtain runtime type of TYPE and do something with it.
    }
}

我尝试关注most upvoted answer of this question,并按照以下方式实施doSomething()

public void doSomething() {
    //                                                            |<-- error starts here
    Class clazz = (Class)((TYPE)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}

然而,这会引发编译器错误:

  

对于类型TYPE

,方法getActualTypeArguments()未定义

我正在编译JDK 1.6u34 - 我哪里错了 - 为什么?

1 个答案:

答案 0 :(得分:0)

正如评论中提到的,由于类型擦除,您无法在运行时获取类型。 我建议使用像:

这样的工厂方法
class SomePOJO<TYPE> {
    // Variable to store runtime type
    Class<TYPE> klass;
    private SomePOJO(Class<TYPE> klass) {
        this.klass = klass;
    }

    // Lots of code

    public void doSomething() {
        // Do what you want with type
        System.out.println(klass);
    }

    // Static factory method
    public static <T> SomePOJO<T> createPojo(Class<T> klass) {
        // Save class object that represents type to SomePOJO instance
        return new SomePOJO<T>(klass);
    }
}

它将帮助您保留doSomething()方法的类型。