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

Java泛型和Groovy的重载

王声
2023-03-14
问题内容

我使用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在编译时绑定该方法,而Groovy尝试在运行时查找该方法并采用它可以找到的任何方法(也许是第一个)。

谁能确切解释这里发生了什么?更准确地理解Java和Groovy之间的不同行为将非常高兴。

我通过将Groovy中的调用委派给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



 类似资料:
  • 问题内容: 除了groovy之外,还有比Java更动态的方法。 为什么这是groovy中的编译时错误(意外令牌): 我该如何编写这种时髦的方式? 问题答案: Groovy解析器不处理以通用信息开头的方法签名。 它解析是否添加public修饰符: 虽然我不相信您会在编译时获得任何用于添加此批注的类型检查

  • Groovy中的简单泛型类 Groovy版本: 这是我做的一个简单的测试用例,当一个更复杂的类不能编译时,错误是“不能将类型T的值赋给类型double[]的变量”。

  • 问题内容: 我有一个代表文本片段的泛型类。该文本片段可能具有多种不同模式(突出显示的不同类型)中的任何一种。这些模式用枚举表示。每个项目的Enum可能不同,但是它必须实现一个接口,该接口提供了一种将其中两个结合的方法(可以突出显示并加粗显示)。所以我有一个界面: 然后我的TextFragment是文本字符串和模式的容器。但是当我尝试声明该类时: 我收到以下错误: 令牌“扩展”的语法错误,预期 根据

  • 这可能是一个非常愚蠢的问题,但我不明白编译器为什么抱怨和编译。 我有两个非常简单的课程: 现在代码是: 我知道它为什么起作用。 块2,我有

  • 问题内容: 我想用泛型和varargs实现一个函数。 这里的意图是断言传递给该函数的所有参数都是扩展作为第一个参数给出的Class的Class对象。因此main方法的前两行将进行编译,而第三行将生成错误。 我的问题是: 为什么前两行会显示“类型安全性:为varargs参数创建了Class的通用数组”消息? 我在这里想念什么吗? 附加问题: 如何重新设计它以防止在调用“ doNastyThingsT

  • 如何获取这个类的类型?对于上下文,我使用ModelMapper,我需要类类型T从S转换为T。 背景: 我已经尝试了N种方法,其中我放置了“//一些方法来获取类型”,但没有任何效果。例如: 或