我想做点什么:
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;
但当然抱怨一个不安全的演员。
答案 0 :(得分:5)
虽然看起来应该是这样,List<String>
不是一个类,所以你不能得到它的类对象。泛型仅用于在编译时检查。它们从编译的字节码中删除。
所以,你能做的最好就是,
Class<List> clz = List.class;
来自有效的java,第2版,
规则中有两个小例外,你不应该使用raw 新代码中的类型,两者都源于泛型类型 信息在运行时被删除(第25项)。你必须使用原始类型 阶级文字。规范不允许使用 参数化类型(尽管它允许数组类型和原语 类型)[JLS,15.8.2]。换句话说,
List.class
,String[].class
和int.class
都是合法的,但List<String>.class
和List<?>.class
都是合法的 不
答案 1 :(得分:2)
参数化类型不是真实类型,因为Java具有不完整的泛型实现。这就是为什么你不能直接在对象中引用参数类型的原因,如果你还不知道它是什么--Java也不知道,因为这些信息只在编译时存在。
List<T>.class
不存在,因为List<T>
实际上并不是“真实”类型。对于任何类型List
,List.class
都是new List<T>().class
与T
相同的类引用。
相同类型的所有通用对象共享相同的代码(这称为type erasure),包括静态成员 - 例如称为.class
的魔术语言神圣只读字段。该语言没有为每个子类型创建不同.class
的机制。