当前位置: 首页 > 面试题库 >

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

蔺翰音
2023-03-14
问题内容

测试(使用反射)最简单的方法是,给定方法(即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>为返回类型的超类型。

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



 类似资料:
  • 我有一个,它存储了一个名为的超类的实例。用户可以将这个类的不同子类放入映射中。映射的键是相应模型的(即),它们也作为实例变量存储在对象中。随后可以通过getter检索实例,该getter使用泛型并将强制转换为所需的子类型。 要检索DAO,您只需执行以下操作: 这工作得很好,但是现在我想要一个检查,当存储的DAO中的模型类不等于时抛出一个异常。即。以下操作在执行时应引发异常: 如前所述,类型也存储在

  • 这似乎可行,但我希望有人能证实这一点: 我的实体有一个基类BaseEntity。 然后我有几个实体,比如从BaseEntity扩展的A、B和C。此外,我还有一个定义为: 现在,我似乎可以使用这个存储库单独查询表A、B或C,只需更改返回类型。例如: 将导致仅从表B中选择行的查询。 真的是这样吗?

  • 问题内容: 假设我有一个s的列表: 我想返回满足一定条件的元素的列表,例如: 在for中 返回元素的子元素的Python方法是什么? 天真的方法: 有没有一种简单的方法可以执行此操作,也许具有列表理解或函数,而没有临时的? 问题答案: 使用清单理解, 或者您可以使用也, 您实际上可以使用Python的真实语义编写相同的条件,例如 另外,您也可以使用功能与你的,像这样的

  • 如问题所示,我实现了一个返回类型为“void”的递归函数(该函数类似于游戏“Flood it!”,这是游戏的链接https://unixpapa.com/floodit/). 因此,每次在游戏对象中调用FloodFill()函数时,它都会改变自己的颜色,如果相邻的瓷砖在一定的条件范围内,它就会激活这些相邻的瓷砖FloodFill()函数。 问题是,我想在递归方法完成后激活其他函数,但由于返回类型为

  • 我想使返回数据类型的的函数与传入的参数的数据类型相同。例如,我会这样调用函数: 因为我将一个传递给,所以它返回了一个

  • 问题内容: 我想做这样的事情: 不幸的是,列表追加未返回修改后的列表。 那么,我如何允许返回新列表? 问题答案: 不要使用追加而是串联: 这将返回一个 新 列表。不会受到影响。如果你需要有受影响的 还有 既可以使用,无论如何,然后分配分开(复印件)。