Java 泛型和 Groovy 重载

标签 java generics groovy easymock type-erasure

我使用 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/

相关文章:

oracle - 在 Katalon Studio 中连接到 Oracle SQL

javascript - 将 HMAC-SHA384 函数从 Java 转换为 JavaScript

java - AlertDialog.Builder 显示 API 请求为 null

java - 在java中重命名文件

c# - 使用 IEnumerable<T> 创建通用集合的通用类

generics - 是否可以对 HashMap 的键和值使用单个泛型?

java - 在标准输出中显示空白字符

generics - F#:使用 List.map 调用一系列方法中的方法

json - 将XmlSlurper GPathResult转换为JSON字符串

grails - 如何测试静态常量值是否传递到 MailService sendMail 闭包而不需要常量上的类前缀?