如何获取对参数化类型的类引用

And*_*iak 6 java generics reflection

是否有机会将参数化类型分配给类引用,例如。

    Class<Set>  c1= Set.class;   //OK
    Class<Set<Integer>> c2 = Set<Integer>.class; //Makes error
Run Code Online (Sandbox Code Playgroud)

Roh*_*ain 7

使用.class带有类名的字面量,或getClass()在对象上调用方法返回Class实例,对于任何类,只有一个Class实例与之关联。

对于泛型类型也是如此。一个类List<T>只有一个类实例,即List.class. 不同的类型参数不会有不同的类类型。这类似于C++实现泛型的方式,其中每个泛型类型实例化都有一个单独的Class实例。所以在 Java 中,你不能做Set<Integer>.class. Java 不允许这样做,因为它没有意义,并且可能会对Class实例数量产生错误的意图。

但是,如果你想要一个Class<Set<Integer>>,你可以实现一些类型转换(这将是安全的),如下所示:

Class<Set<Integer>> clazz = (Class<Set<Integer>>)(Class<?>) Set.class;
Run Code Online (Sandbox Code Playgroud)

这将工作得很好。