2011-12-18 98 views
0

以下代碼獲取在接口SomeGenericInterface中一般聲明的第一個類型參數類,它在類SomeClass中得到具體實現。獲取泛型類型參數的正確方法

此代碼實際工作。

的問題是:是否在任何情況下工作,即是以下兩個類方法:

  • getInterfaces()
  • getGenericInterfaces()

保證始終有相同數量的元素這些方法返回接口的相同順序?

還是有一些更安全的方法來做到這一點?

<!-- language: lang-java --> 

Class clazz = SomeClass.class; 

Class classes[] = clazz.getInterfaces(); 
Type types[] = clazz.getGenericInterfaces(); 
ParameterizedType found = null; 

for (int i=0; i<classes.length; i++) { 
    if ( classes[i] == SomeGenericInterface.class) { 
     found = (ParameterizedType) types[i]; 
     break; 
    } 
} 
if (found == null) { 
    return null; 
} 
Class firstType = (Class) found.getActualTypeArguments()[0]; 

回答

2

javadoc兩種方法規定:

如果該對象表示的一類,則返回值是包含表示由 類實現的所有接口對象的數組 。數組中接口對象的順序對應於 由此對象表示的類的聲明的implements子句中的接口名稱的順序。

所以你的問題的答案是肯定的,相同數量的元素和相同的順序。

+0

這正是我所期待的。謝謝,rsp! – hpgisler 2011-12-19 20:13:38

+0

來自http://stackoverflow.com/questions/22250619/classgetinterfaces-and-classgetgenericinterfaces-return-arrays-of-differin我必須警告,這個假設只適用於javac編譯的代碼。如果課程來自其他地方,所有投注都關閉 – blackdrag 2014-03-12 13:36:46

0

是否在任何情況下

沒有工作,但不適合你懷疑的原因。它只會在類直接實現接口(而不是從super類接口)和指定類型參數的具體類型(與使用類型參數相反,如下例)相同時才起作用。

class CounterExample<T> implements Interface<T> {} 
+0

是的,謝謝,我實際上已經意識到這一點;問題實際上是,包含在類[]和類型[]中的接口的順序是否保證與具體類型參數直接實現接口的具體類(ok沒有明確說明,抱歉)相同。正如rsp指出的那樣:是的。 – hpgisler 2011-12-19 20:22:10