【发布时间】:2014-05-21 04:22:46
【问题描述】:
假设我有一个方法:
public class AwesomeClass {
public <E> List<E> convertIterableToList(Iterable<E> iterable) {
...
}
}
在运行时,如何根据参数类型解析方法的返回类型?例如,我希望实现一个假设的方法resolveReturnType,它的行为在这个小(伪Java)单元测试中得到了展示:
Method method = AwesomeClass.class.getDeclaredMethod("convertIterableToList", Iterable.class);
Type argumentType = {{{Set<String>}}}; // Just pretend this syntax works. :)
Type expectedReturnType = {{{List<String>}}};
Type actualReturnType = resolveReturnType(method, argumentType);
assertEquals(expectedReturnType, actualReturnType);
到目前为止,我一直在尝试使用 Guava 的 TypeToken 类,但进展不大。
【问题讨论】:
-
你看过@stackoverflow.com/questions/3941384/…吗?还有,既然知道了参数类型,就可以从参数类型中扣除返回值,为什么还要再检查返回类型呢?
-
@Smutje:我在这个问题上花了很多时间,但它似乎并没有解决这个问题。如果我理解正确,他们会尝试在运行时从 object 获取通用信息。我提供的代码只是一个单元测试,展示了我想要完成的工作。实际的生产代码不会知道预期的返回类型。生产代码将使用
resolveReturnType告诉它一个方法的返回类型是什么,给定它的参数类型。 -
你看过
TypeToken.resolveType(Type)的Javadoc吗? -
但是,再说一遍 - 你为什么要重新计算已知的东西?
-
@LouisWasserman:我查看了
resolveType,我已经研究了一个晚上,但我无法让它按照我想要的方式解决。 :(
标签: java generics reflection guava