Java泛型和Groovy重载

Java泛型和Groovy重载,java,generics,groovy,easymock,type-erasure,Java,Generics,Groovy,Easymock,Type Erasure,我使用Groovy、JUnit和EasyMock为Java应用程序编写单元测试。 在EasyMock中,有几种重载方法capture(),这些方法已被弃用,并附有注释“因为更难执行擦除,所以不能在Java 7中编译”。这些方法将Capture类型的对象作为参数。除其他外,存在以下方法: 静态布尔捕获(捕获捕获) 静态布尔捕获(捕获捕获) 静态T捕获(捕获捕获) 这在Java中不再被允许,但是如果您直接从Java调用代码,就会调用正确的方法。例如,当您执行此代码时 Capture<My

我使用Groovy、JUnit和EasyMock为Java应用程序编写单元测试。 在EasyMock中,有几种重载方法
capture()
,这些方法已被弃用,并附有注释“因为更难执行擦除,所以不能在Java 7中编译”。这些方法将
Capture
类型的对象作为参数。除其他外,存在以下方法:

  • 静态布尔捕获(捕获捕获)
  • 静态布尔捕获(捕获捕获)
  • 静态T捕获(捕获捕获)
这在Java中不再被允许,但是如果您直接从Java调用代码,就会调用正确的方法。例如,当您执行此代码时

Capture<MyClass> myClassCapture = new Capture<MyClass>();
mockObject.someMethod(capture(myClassCapture));
Capture myClassCapture=new Capture();
someMethod(捕获(myClassCapture));
调用正确的方法(列表中的最后一个)

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

有人能解释一下这里到底发生了什么吗?这将有助于更准确地理解Java和Groovy之间的不同行为

我通过将Groovy内部的调用委托给一个Java方法来修复它,该方法将为我完成这项工作:

public class EasyMockUtils {

    public static <T> T captureObject(Capture<T> captureForObject) {
        return EasyMock.capture(captureForObject);
    }
}
公共类EasyMockUtils{
公共静态T captureObject(Capture captureForObject){
返回EasyMock.capture(captureForObject);
}
}

有没有更好的方法?

尝试使用Groovy 2.0的@CompileStatic-也许它可以解决您的问题

我自己用EasyMock 3.0解决这个问题就行了。然而,从EasyMock 3.2开始,它似乎已经通过重命名所有使用包装原语的方法而得到解决,只剩下一个捕获方法


查看3.2文档以了解更多信息:

如果你是对的,Groovy会在运行时尝试选择该方法,由于擦除,所有这些方法看起来都一样,所以我想它只是抓住了第一个