如何学习泛型类的实际类型参数?

Tan*_*ler 7 java generics reflection

我有一个参数化类:

class ParameterizedClass<T extends AbstractSomething> {
}
Run Code Online (Sandbox Code Playgroud)

电话:

new ParameterizedClass<Something>();
Run Code Online (Sandbox Code Playgroud)

那么如何T通过使用Java Generics 获得实际类型?

jqn*_*qno 11

它可以完成,但类型擦除可以使它变得非常困难.至于其他的答案讨论,你要么必须做出的一个子类ParameterizedClass,或添加类型的字段TParameterizedClass,和你需要的反射代码来做到这一点是令人费解的.

在这些情况下我建议的是解决这个问题:

class ParameterizedClass<T> {
    private Class<T> type;

    /** Factory method */
    public static <T> ParameterizedClass<T> of(Class<T> type) {
        return new ParameterizedClass<T>(type);
    }

    /** Private constructor; use the factory method instead */
    private ParameterizedClass(Class<T> type) {
        this.type = type;
    }

    // Do something useful with type
}
Run Code Online (Sandbox Code Playgroud)

由于Java的静态方法类型推断,您可以构建您的类而不需要太多额外的样板:

ParameterizedClass<Something> foo = ParameterizedClass.of(Something.class);
Run Code Online (Sandbox Code Playgroud)

这样,您ParameterizedClass就完全通用且类型安全,并且您仍然可以访问类对象.

编辑:解决了评论


Adr*_*onk 8

您可以在构造函数中使用此技巧:(请参阅http://www.hibernate.org/328.html)

Class<T> parameterType = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
Run Code Online (Sandbox Code Playgroud)

但我相信这个代码只有在类被子类化并且子类的实例执行它时才有效.