从通用基本接口的实例检索类型参数


问题内容

给定2个接口:

public interface BaseInterface<T> { }
public interface ExtendedInterface<T0, T1> extends BaseInterface<T0> {}

和一个具体的类:

public class MyClass implements ExtendedInterface<String, Object> { }

如何找出传递给BaseInterface接口的类型参数?

(我可以通过调用类似以下内容来检索ExtendedInterface类型参数

MyClass.class.getGenericInterfaces()[0].getActualTypeArguments()

但我无法找到一种简便的方法来递归到任何基本的通用接口并获取有意义的东西)。


问题答案:

通常,这个问题不容易完全解决。例如,如果它是一个内部类,还必须考虑包含类的类型参数,…

因为仅使用Java本身提供的内容就很难对泛型类型进行反射,所以我编写了一个完成艰苦工作的库:gentyref。请访问http://code.google.com/p/gentyref/
。例如,使用gentyref,您可以执行以下操作:

Type myType = MyClass.class;

// get the parameterized type, recursively resolving type parameters
Type baseType = GenericTypeReflector.getExactSuperType(myType, BaseInterface.class);

if (baseType instanceof Class<?>) {
    // raw class, type parameters not known
    // ...
} else {
    ParameterizedType pBaseType = (ParameterizedType)baseType;
    assert pBaseType.getRawType() == BaseInterface.class; // always true
    Type typeParameterForBaseInterface = pBaseType.getActualTypeArguments()[0];
    System.out.println(typeParameterForBaseInterface);
}