如何获得具体类型的通用接口的

问题描述:

我有一个接口如何获得具体类型的通用接口的

public interface FooBar<T> { } 

我有一个实现它

public class BarFoo implements FooBar<Person> { }

与反思,我要带BarFoo的实例类并得到它实现的FooBar版本是Person。

我使用BarFoo的.getInterfaces返回到FooBar,但这并不能帮助我找出T是什么。

您可以通过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

尝试类似如下:

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