获取超类的超级接口参数类

时间:2018-04-09 22:25:28

标签: java generics reflection nested-generics

我在获取实现参数化接口的抽象超类的参数时遇到了一些麻烦。

我有这些类和接口:

interface Request<T extends Bean>

abstract class ProxyRequest<T extends Bean> implements Request<T>

class FooRequest extends ProxyRequest<Foo>

我想要实现的是从Foo.class实例开始FooRequest

我正在尝试这个,但结果是T。我做错了什么?

FooRequest request = new FooRequest();
Type[] genericInterfaces = request.getClass().getSuperclass().getGenericInterfaces();
Type[] genericTypes = ((ParameterizedType)genericInterfaces[0]).getActualTypeArguments();
System.out.println(genericTypes[0]);

1 个答案:

答案 0 :(得分:1)

你迈出这一步太过分了。您所需要的只是通用超类(ProxyRequest<Foo>),您可以通过调用getGenericSuperclass来获得,即:

FooRequest request = new FooRequest();
Type[] genericTypes = ((ParameterizedType) request.getClass().getGenericSuperclass())
        .getActualTypeArguments();
System.out.println(genericTypes[0]); // class Foo

使用您的代码段,您将获得T,因为:

  1. request.getClass()返回FooRequest.class
  2. .getSuperclass()返回ProxyRequest.class
  3. .getGenericInterfaces()返回包含Request<T extends Bean>
  4. 的数组
  5. ((ParameterizedType)genericInterfaces[0]).getActualTypeArguments()返回一个包含TypeVariable<...> T的数组,其中Bean为约束。