给出以下界面:
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
?
答案 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