一尘不染

如何测试方法返回类型是否与列表匹配

java

测试(使用反射)最简单的方法是,给定方法(即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();
}

阅读 308

收藏
2020-12-03

共1个答案

一尘不染

通常,仅使用Java本身提供的工具来解决这个问题实际上并不容易。有很多特殊情况(嵌套类,类型参数范围等)需要注意。因此,我编写了一个使泛型类型反射更容易的库:gentyref。我添加了示例代码(以JUnit测试的形式)以显示如何使用它来解决此问题:StackoverflowQ182872Test.java。基本上,您只需GenericTypeReflector.isSuperType使用TypeToken(来自Neil
Gafter的
想法)进行调用,以查看是否List<String>为返回类型的超类型。

我还添加了第5个测试用例,以表明GenericTypeReflector.getExactReturnType有时需要对返回类型()进行额外的转换,以将类型参数替换为其值。

2020-12-03