默认情况下,Groovy是否自动将布尔值设置为对象?

时间:2016-09-09 08:50:05

标签: java groovy boxing

考虑这个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

出现问题

3 个答案:

答案 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不同,这会导致您的问题:

http://docs.groovy-lang.org/latest/html/documentation/core-differences-java.html#_primitives_and_wrappers

您的问题的解决方案是投射您的" 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)对象