获取参数化类型的java.lang.Class <T>对象的对象而不在q_uestion中构造类?

mar*_*hon 2 java class

我想做的事情如下:

Class<List<String>> targetClass = List<String>.class;
Run Code Online (Sandbox Code Playgroud)

但那个结构不能编译.

编译器可以正常使用

Class<List<String>> targetClass;
Run Code Online (Sandbox Code Playgroud)

声明,但编译器不喜欢

List<String>.class
Run Code Online (Sandbox Code Playgroud)

有趣的是,编译器(1.7)允许这样:

Class<List<String>> targetClass = (Class<List<String>>) List.class;
Run Code Online (Sandbox Code Playgroud)

但当然抱怨一个不安全的演员阵容.

Jef*_*man 5

虽然它看起来应该是,但List<String>不是一个类,所以你不能得到它的类对象.泛型仅用于在编译时检查.它们从编译的字节码中删除.

所以,你能做的最好的就是,

Class<List> clz = List.class;
Run Code Online (Sandbox Code Playgroud)

来自有效的java,第2版.,

规则有两个小的例外,即你不应该在新代码中使用原始类型,这两个原因都源于在运行时擦除泛型类型信息(第25项).您必须在类文字中使用原始类型.规范不允许使用参数化类型(尽管它允许数组类型和基元类型)[JLS,15.8.2].换句话说, List.class,String[].class,和 int.class都是合法的,但 List<String>.classList<?>.class没有