如何创建代表通用对象的Class
?
List<String> list = new List<String>();
Class c1 = list.class;
Class c2 = Class.forName(???); // <- how?
assert c1 == c2;
答案 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;