考虑这个Java类:
public class Demo {
public void a(boolean a){
System.out.println("boolean was called");
}
public void a(Object a){
System.out.println("Object was called");
}
}
Groovy类:
class Groovy {
static void main(String[] args) {
def demo = new Demo()
demo.a(true)
}
}
输出:
Object was called
在Groovy中为它编写测试并传入原始true
调用a(Object)
。
这是预期的行为吗?如何调用其他方法? (我在版本2.4.6上)
仅供参考,这会导致EasyMock(#175890293)
出现问题答案 0 :(得分:2)
我想这是有意的,请参阅groovy手册:
http://groovy-lang.org/objectorientation.html
Groovy支持与Java定义的原始类型相同的原始类型 语言规范:
[...]
布尔类型(完全正确或错误)
[...]
虽然Groovy声明并存储原始字段和变量 原语,因为它使用对象作为一切,它自动装配 对原语的引用。就像Java一样,它使用的包装器是
表1.原始包装器
Primitive type Wrapper class
boolean Boolean
答案 1 :(得分:1)
Groovy autowraps原语,因此它是预期的行为。
同样由于自动包装,方法解析与Java不同,这会导致您的问题:
您的问题的解决方案是投射您的" true"常量为方法调用中的布尔基元。
class Groovy {
static void main(String[] args) {
def demo = new Demo()
demo.a((boolean) true)
}
}
这打印"布尔值被称为"。
答案 2 :(得分:1)
我以前的回答只对Groovy 2.4.8有效,所以我会把它留在那里。在2.4.8中,此行为已得到修复(请参阅https://issues.apache.org/jira/browse/GROOVY-7933)。因此,此示例中解析方法的新顺序为:
1)布尔(包裹)
2)布尔
3)对象