gpt4 book ai didi

Java 泛型和 Groovy 重载

转载 作者:搜寻专家 更新时间:2023-11-01 03:42:35 24 4
gpt4 key购买 nike

我使用 Groovy、JUnit 和 EasyMock 为我的 Java 应用程序编写单元测试。在 EasyMock 中有几个重载方法 capture()已弃用注释“由于执行更严格的删除,无法在 Java 7 中编译”。这些方法将 Capture<T> 类型的对象作为参数.除其他外,存在以下方法:

  • static boolean capture(Capture<Boolean> captured)
  • static boolean capture(Capture<Integer> captured)
  • ...
  • static <T> T capture(Capture<T> captured)

这在 Java 中不再被允许,但如果您直接从 Java 调用该代码,则会调用正确的方法。例如。当你执行这段代码时

Capture<MyClass> myClassCapture = new Capture<MyClass>();
mockObject.someMethod(capture(myClassCapture));

正确的方法(列表中的最后一个)被调用。

另一方面,如果您从 Groovy 内部调用相同的代码,则会调用列表中的第一个方法并在我的测试中给出错误。我认为这与 Java 和 Groovy 如何解析方法有关。我的假设是 Java 在编译时绑定(bind)方法,而 Groovy 尝试在运行时查找方法并采用它能找到的任何方法(可能是第一个)。

谁能准确解释这里发生了什么?这将有助于更准确地理解 Java 和 Groovy 之间的不同行为。

我通过将 Groovy 内部的调用委托(delegate)给一个 Java 方法来修复它:

public class EasyMockUtils {

public static <T> T captureObject(Capture<T> captureForObject) {
return EasyMock.capture(captureForObject);
}
}

有没有更好的方法?

最佳答案

我自己使用 EasyMock 3.0 解决了这个问题。然而,从 EasyMock 3.2 开始,它似乎已通过重命名所有采用包装原语的方法并仅留下一个剩余的捕获方法来解决。

查看 3.2 文档以获取更多信息:http://easymock.org/api/easymock/3.2/org/easymock/EasyMock.html#capture%28org.easymock.Capture%29

关于Java 泛型和 Groovy 重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10932288/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com