2010-07-14 69 views
15

我有一個接口如何獲得具體類型的通用接口的

public interface FooBar<T> { } 

我有一個實現它

public class BarFoo implements FooBar<Person> { }

與反思,我要帶BarFoo的實例類並得到它實現的FooBar版本是Person。

我使用BarFoo的.getInterfaces返回到FooBar,但這並不能幫助我找出T是什麼。

回答

24

您可以通過Class#getGenericInterfaces()搶一類的通用接口,你再依次檢查,如果它是一個ParameterizedType,然後搶actual type arguments相應。

Type[] genericInterfaces = BarFoo.class.getGenericInterfaces(); 
for (Type genericInterface : genericInterfaces) { 
    if (genericInterface instanceof ParameterizedType) { 
     Type[] genericTypes = ((ParameterizedType) genericInterface).getActualTypeArguments(); 
     for (Type genericType : genericTypes) { 
      System.out.println("Generic type: " + genericType); 
     } 
    } 
} 
+0

非常感謝!投射到參數化類型幫助 – bwawok 2010-07-14 14:34:01

+0

不客氣。 – BalusC 2010-07-14 14:48:12

+4

請注意,如果他們將BarFoo定義爲通用的BarFoo 然後使用新的BarFoo (),那麼這將不起作用,即使這與「他們」的觀點相同。 – 2010-07-14 15:23:50

5

嘗試類似如下:

Class<T> thisClass = null; 
Type type = getClass().getGenericSuperclass(); 
if (type instanceof ParameterizedType) { 
    ParameterizedType parameterizedType = (ParameterizedType) type; 
    Type[] typeArguments = parameterizedType.getActualTypeArguments(); 
    thisClass = (Class<T>) typeArguments[0]; 
} 
+1

GenericSuperClass!= GenericInterface – BalusC 2010-07-14 14:31:44

+0

關閉,但它沒有讓我接口。 BalusC有缺失的環節。 – bwawok 2010-07-14 14:33:40

+1

啊錯過了差異。那麼,如果你需要GenericSuperClass,請使用這個:) – 2010-07-14 14:35:34