6

有没有办法获得泛型方法的返回类型 - 返回类型?

public interface MyGeneric<T> {
  T doSomething();
}

public interface MyElement extends MyGeneric<Element> {

}

public class Main {
  public static final void main(String[] args) {
    System.out.println(MyElement.class.getMethod("doSomething", new Class<?>[0]).magic()); // => Element
  }
}

使用 Method.getReturnType() 我得到 java.lang.Object 没有。方法“魔术”是否存在?

4

2 回答 2

6

不幸的是,核心 Java 库中的反射能力对于分析泛型类型相当差。您可以使用这些getGeneric...方法(例如,getGenericReturnType()),但它们的效果并不好,而且它们通常返回Type实例而不是Class实例。我觉得这很笨拙。

我已经编写了自己的反射 API,基于 .NET,我觉得它更加一致(特别是在涉及泛型的情况下)。考虑以下输出:

import com.strobel.reflection.Type;

interface MyGeneric<T> {
    T doSomething();
}

interface Element {}

interface MyElement extends MyGeneric<Element> {}

class Main {
    public static final void main(String[] args) throws NoSuchMethodException {
        // prints "class java.lang.Object":
        System.out.println(
            MyElement.class.getMethod("doSomething").getReturnType()
        );
        // prints "T":
        System.out.println(
            MyElement.class.getMethod("doSomething").getGenericReturnType()
        );
        // prints "Element":
        System.out.println(
            Type.of(MyElement.class).getMethod("doSomething").getReturnType()
        );
    }
}

欢迎您使用我的图书馆。实际上,我刚刚提交了一个错误修复,导致这个示例无法正常工作(它位于develop分支的顶端)。

于 2013-11-11T13:32:43.043 回答
1

不,这种魔法一般不存在。如果您想使用技巧来获取该数据,您可以在界面中要求该数据,如下所述

另一方面,如果您的类型很特殊(如 List),您可以这样做。有关特殊类型,请参见此答案

于 2013-11-11T13:06:54.943 回答