2011-02-17 78 views
3

如何创建代表通用对象的Class如何获得泛型类的类?

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

是什么你真的想在这里完成? – 2011-02-17 14:30:15

回答

5

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

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

它是完全相同的对象,无论它是如何打出来。

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

Class并不代表一般类型。使用的适当类型是java.lang.reflect.Type,特别是ParameterizedType。你可以通过反射来获得这些物体或制作你自己的物体。

(注意,仿制药是一个静态打字功能,这样是不是真的适合运行时对象。静态类型的信息恰好被保存在类文件并通过反射物体的反射API暴露。)