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

我有这些类和接口:

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]);

最佳答案

您将这一步走得太远了。您需要的是泛型超类(ProxyRequest<Foo>),您可以通过调用getGenericSuperclass来获得它,即:

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




使用您的代码段,您得到T的原因是:


request.getClass()返回FooRequest.class
.getSuperclass()返回ProxyRequest.class
.getGenericInterfaces()返回带有Request<T extends Bean>的数组
((ParameterizedType)genericInterfaces[0]).getActualTypeArguments()返回一个以TypeVariable<...> T为边界的数组。

07-24 09:39
查看更多