是否可以在运行时获取类型参数?
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();
我知道在 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();