是否可以在运行时获取类型参数?

Is it possible to get type parameters at runtime?

我知道在 Java 中,由于擦除,我们在 运行 时没有参数化类型。但是有没有可能在 运行 时间得到那些被擦除的参数?让我举一些例子:

public class MyClass<T>{ };

public static void foo(MyClass<?> p){
    //do staff
}

public void main(String[] args){
    MyClass<Integer> i = new MyClass<Integer>();
    foo(i);
}

现在,我们将 i 作为参数传递给 foo。是否可以在 foo 的正文中查询 i 实例化的类型参数?也许某些反射设施会在 运行 时间保存该信息?

从未用静态方法测试过。 但是下面的https://github.com/jhalterman/typetools可以在运行时获取泛型

不,这是不可能的。为了访问泛型的类型信息,您必须这样做:

public class MyIntegerClass extends MyClass<Integer> {
    // class body
}

然后:

public void main(String[] args){
    MyIntegerClass i = new MyIntegerClass();
    foo(i);
}

最后,在您的 'foo' 方法中:

Type superclassType = object.getClass().getGenericSuperclass();
Type[] typeArgs =  ((ParameterizedType)superclassType).getActualTypeArguments();

您可以做的另一件事:

private Class<T> type;

public MyClass(Class<T> type) {
    this.type = type;
}

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

然后你会像这样实例化:

MyClass<Integer> i = new MyClass<Integer>(Integer.class);

不是最好的方法,但它解决了问题。您可以访问 foo:

中的类型
p.getType();