对于一个普通的类型,如Integer,我们可以用Integer.class得到它的Class对象。但是对于一个模板类,如:
class A<T> {}
使用A<Integer>.class却会报错。但是如果派生出一个子类则没有问题,如:
class B extends A<Integer> {}
这时候使用B.class就可以。请问为什么会这样?有什么办法可以获得模板类的class吗?

解决方案 »

  1.   


    但是这样我就无法指明模板参数了。这么说吧,我现在要获得一个类型为A<X>的Class对象,X是一个已知的确定的类型。定义的时候A<X> clazz这样是可以的,但是A<X>.class就不行了。
      

  2.   

    搬运工在此。
    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
      

  3.   


    似乎不能很好地解决我的这个问题……一定要绕到class.getField那去吗?要是这个不是一个成员变量呢?或者根本就没有实例化?
      

  4.   

    能举个你期望的场景么?“A<Integer>.class”这本身是没意义的,因为这个类定义在编译态根本不存在。
      

  5.   


    具体的例子大概是这样: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的话就失效了,想看看有没有更好的办法。
      

  6.   

    貌似模板A<某类型>的class和A.class是一样的,话说我感觉你这么写是对的啊。。
      

  7.   

    你的目标有些诡异,似乎想要实现动态约束模板参数,这个应该实现不了,因为Java在运行态就已经擦除所有泛型的信息了。而getClass() 这样的函数,实际上就是按照运行态的效果来设计的,所以泛型已经消失。