我想做的事情如下:
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)
但当然抱怨一个不安全的演员阵容.
虽然它看起来应该是,但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>.class并List<?>.class没有
| 归档时间: |
|
| 查看次数: |
1189 次 |
| 最近记录: |