如何用泛型返回类型推断方法的特定返回类型?

时间:2018-12-09 06:46:27

标签: java generics reflection

给出以下界面:

interface Random extends java.util.function.Supplier<Integer> { }

java.util.function.Supplier如下所示(缩写):

public interface Supplier<T> { T get(); }

现在考虑以下几点:

java.lang.reflect.Method get = Random.class.getMethod("get");
System.out.println(get.getReturnType()); // prints `class java.lang.Object`
System.out.println(get.getGenericReturnType()); // prints `T`

如何推断返回类型实际上应为java.lang.Integer

2 个答案:

答案 0 :(得分:2)

您可能可以使用下面的代码执行此操作。这里的想法是通用类型信息可能在字节码中可用,并且可以在运行时访问。请参阅下面的链接以获取更多详细信息。

ParameterizedType parameterizedType = (ParameterizedType) subClass.getGenericSuperclass();
09
  return (Class<?>) parameterizedType.getActualTypeArguments()[parameterIndex];

https://www.javacodegeeks.com/2013/12/advanced-java-generics-retreiving-generic-type-arguments.html

在线上还有其他一些有用的文章对此进行了描述。

答案 1 :(得分:0)

Ankur的回答是正确的,因为它为使用的技术提供了提示。但是,涵盖所有极端情况的通用解决方案非常复杂,这证明需要一个小型库。

进一步研究该主题之后,我发现了一个极好的解决方案:https://github.com/leangen/geantyref#getting-the-exact-return-type-of-a-method