测试(使用反射)最简单的方法是,给定方法(即java.lang.Method实例)是否具有返回类型,可以安全地强制转换为List ?
考虑以下代码段:
public static class StringList extends ArrayList<String> {} public List<String> method1(); public ArrayList<String> method2(); public StringList method3();
所有方法1、2、3均满足要求。对于method1进行测试非常容易(通过getGenericReturnType(),该方法返回ParameterizedType的实例),但是对于method2和3来说,并不是那么明显。我想通过遍历所有getGenericSuperclass()和getGenericInterfaces(),我们可以很接近,但我不知道如何将List 中的TypeVariable(发生在超类接口中的某处)与实际匹配。类型参数(即此E与字符串匹配的地方)。
或者,也许有一种我完全忽略的(更轻松)的方式?
编辑: 对于那些正在研究它的人,这里是method4,它也满足了要求,并显示了更多情况,需要进行调查:
public interface Parametrized<T extends StringList> { T method4(); }
通常,仅使用Java本身提供的工具来解决这个问题实际上并不容易。有很多特殊情况(嵌套类,类型参数范围等)需要注意。因此,我编写了一个使泛型类型反射更容易的库:gentyref。我添加了示例代码(以JUnit测试的形式)以显示如何使用它来解决此问题:StackoverflowQ182872Test.java。基本上,您只需GenericTypeReflector.isSuperType使用TypeToken(来自Neil Gafter的想法)进行调用,以查看是否List<String>为返回类型的超类型。
GenericTypeReflector.isSuperType
TypeToken
List<String>
我还添加了第5个测试用例,以表明GenericTypeReflector.getExactReturnType有时需要对返回类型()进行额外的转换,以将类型参数替换为其值。
GenericTypeReflector.getExactReturnType