对于一个普通的类型,如Integer,我们可以用Integer.class得到它的Class对象。但是对于一个模板类,如:
class A<T> {}
使用A<Integer>.class却会报错。但是如果派生出一个子类则没有问题,如:
class B extends A<Integer> {}
这时候使用B.class就可以。请问为什么会这样?有什么办法可以获得模板类的class吗?
class A<T> {}
使用A<Integer>.class却会报错。但是如果派生出一个子类则没有问题,如:
class B extends A<Integer> {}
这时候使用B.class就可以。请问为什么会这样?有什么办法可以获得模板类的class吗?
但是这样我就无法指明模板参数了。这么说吧,我现在要获得一个类型为A<X>的Class对象,X是一个已知的确定的类型。定义的时候A<X> clazz这样是可以的,但是A<X>.class就不行了。
public class GenericTest {
public List<String> list = new LinkedList<String>();
public static void main(String[] args) throws SecurityException, NoSuchFieldException {
ParameterizedType pt = (ParameterizedType) GenericTest.class.getField(
"list").getGenericType();
System.out.println(pt.getActualTypeArguments().length);
System.out.println(pt.getActualTypeArguments()[0]);
}
}
STFW:http://www.iteye.com/topic/585900
似乎不能很好地解决我的这个问题……一定要绕到class.getField那去吗?要是这个不是一个成员变量呢?或者根本就没有实例化?
具体的例子大概是这样:class A<T> {...}class C<X> {
Class<A<X>> clazz;
public C(Class<A<X>> clazz) {
this.clazz = clazz;
}
...
}我在构造C类的时候,需要接受一个类型为Class<A<X>>的参数clazz,后续用于创建实例等其他用途。尽管这里也可以将A后面<X>去掉,但是我这样就失去了对模板参数的约束,并且会报一个warning。我现在的解决方案就是继承出一个A的子类:
class B extends A<Integer> {}
构造的时候传递B.class,这样感觉有点多余,况且遇上A为final的话就失效了,想看看有没有更好的办法。