2011-02-17 105 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暴露。)