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

时间:2012-03-21 21:40:48

标签: java class

我想做点什么:

Class<List<String>> targetClass = List<String>.class;

但该构造不能编译。

编译器可以使用

Class<List<String>> targetClass;

声明,但编译器不喜欢

List<String>.class

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

Class<List<String>> targetClass = (Class<List<String>>) List.class;

但当然抱怨一个不安全的演员。

2 个答案:

答案 0 :(得分:5)

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

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

Class<List> clz = List.class;

来自有效的java,第2版,

  

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

答案 1 :(得分:2)

参数化类型不是真实类型,因为Java具有不完整的泛型实现。这就是为什么你不能直接在对象中引用参数类型的原因,如果你还不知道它是什么--Java也不知道,因为这些信息只在编译时存在。

List<T>.class不存在,因为List<T>实际上并不是“真实”类型。对于任何类型ListList.class都是new List<T>().classT相同的类引用。

相同类型的所有通用对象共享相同的代码(这称为type erasure),包括静态成员 - 例如称为.class的魔术语言神圣只读字段。该语言没有为每个子类型创建不同.class的机制。