如何获得泛型类?

时间:2011-02-17 14:21:29

标签: java

如何创建代表通用对象的Class

List<String> list = new List<String>();
Class c1 = list.class;
Class c2 = Class.forName(???); // <- how?
assert c1 == c2;

4 个答案:

答案 0 :(得分:8)

类对象不是特定于满足其类型参数的特定类:

assert (new ArrayList<String>()).getClass() == (new ArrayList<Integer>()).getClass();

无论输入方式如何,它都是完全相同的对象。

答案 1 :(得分:6)

由于type erasure

,因此在运行时期间不存在通用信息,因此不能这样做

您的代码可以写成:

List<String> list = new ArrayList<String>();
Class c1 = list.getClass();
Class c2 = Class.forName("java.util.ArrayList");
System.out.println(c1 == c2); // true

答案 2 :(得分:2)

Class不代表一般类型。要使用的适当类型是java.lang.reflect.Type,特别是ParameterizedType。您可以通过反射获取这些对象,也可以自己创建。

(注意,泛型是静态类型的特性,因此不适合运行时对象。静态类型信息恰好保存在类文件中,并通过反射对象上的反射API公开。)

答案 3 :(得分:0)

这对我有用: (Class<List<MYTYPE>>) Class.forName("java.util.ArrayList")

对于您的情况:

List<String> list = new List<String>();
Class c1 = list.class;
Class c2 = (Class<List<String>>) Class.forName("java.util.ArrayList")
assert c1 == c2;