2010-03-26 80 views
2

所以我有一些像Java中的以下內容:檢索集合類型

private List<SomeType>variable; 

// ....variable is instantiated as so ... 
variable = new ArrayList<SomeType>(); 

// there's also a getter 
public List<SomeType> getVariable() { /* code */ } 

我想做什麼就能做的是弄清楚,variableSomeType集合編程。我讀here,我可以確定從方法getVariable(),但有沒有什麼辦法可以直接告訴variable

我已經能夠根據鏈接中的信息從getter方法檢索SomeType。我也成功地通過SurroundingClass.getClass().getDeclaredFields()檢索了周圍班級的所有字段,但這並不告訴我它是List<SomeType>

編輯:基於bmargulies的迴應如下操作會達到我想要的:

Field[] fields = SurroundingClass.getDeclaredFields(); 
/* assuming it is in fields[0] and is a ParameterizedType */ 
ParameterizedType pt = (ParameterizedType) fields[0].getGenericType(); 
Type[] types = pt.getActualTypeArguments(); 
/* from types I'm able to see the information I've been looking for */ 

回答

7

不能從實例中得到這個,因爲類型擦除。在運行時,XXX<T>實際上只是XXX。除非班級爲T存儲一個Class引用做出特殊安排,否則它完全徹底地消失了。

您可以從getDeclaredFields()中獲取它。您必須在字段上調用getGenericType,而不是getType,然後必須對ParameterizedType執行一些轉換,然後向其請求所需的參數。

+0

啊,getDeclaredFields()原來是它鑄造ParameterizedType後完美地工作在尋找的元素之一得到SOMETYPE。 – nevets1219

1

您可以通過在集合

Collection<String> abc = new ArrayList<String>(); 
for (Object x : abc) { String className = x.getClass().getName(); break; } 
+0

我想過嘗試這個,但並沒有因爲我沒有一個實際的對象來處理,我也不想實例化這個對象的一個​​實例。不過,很高興知道這是一個有效的方法。 – nevets1219