2015-07-21 56 views
11

我聲明一個類如下:以編程方式獲取泛型聲明的值?

public class SomeClass extends AdditionalClass<GenericClass> { 
    ... 
} 

這...

SomeClass object = new SomeClass(); 
System.out.println(object.getSuperClass().getSimpleName()); 

...產量 「AdditionalClass」。什麼方法調用或允許我詢問該對象,並得到「GenericClass」?

+2

與您的問題沒有關係,但您爲什麼要檢查泛型? – CKing

+0

我以編程方式從應用程序中提取聲明,以便可以將它們提供給整潔的電子表格中的非技術用戶。 –

+0

好的。我只是想確保你沒有爲了一個簡單的任務走錯路。那就是說,爲什麼非技術用戶會關心泛型? – CKing

回答

14

您必須獲取超類的ParameterizedType(s)的數組。例如:

SomeClass object = new SomeClass(); 
Type parameterizedClassType = 
     ((ParameterizedType) object.getClass().getGenericSuperclass()) 
     .getActualTypeArguments()[0]; 
System.out.println(parameterizedClassType.getTypeName()); 

這應該打印com.whateverpackage.GenericClass

請注意,編譯SomeClass時會發生偶數類型的擦除,因爲它們是類的定義的部分保留有關超類的類型參數信息。

但是,如果SomeClass是一個通用的一個(即是像​​),那麼對於所有的SomeClass實例的類型參數(即<X>)將已被替換一些實際的類型,不會一直部分.getActualTypeParameters()陣列。

+0

當'GenericClass'本身是一個泛型類型時,這是否工作?即列表

+0

它的工作,是的。值得一試:) –

+0

我在那上;)但是,如果將'parameterizedClassType'強制轉換爲'Class',則不起作用。但只要你使用'Type',一切都應該沒問題。 –