默认情况下 Groovy 自动框布尔值是否为对象?

Does Groovy auto-box boolean to Object by default?

考虑这个 Java class:

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:

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)

我会说这是有意的,请参阅 groovy 手册:

http://groovy-lang.org/objectorientation.html

Groovy supports the same primitive types as those defined by the Java Language Specification:

[...]

boolean type (exactly true or false)

[...]

While Groovy declares and stores primitive fields and variables as primitives, because it uses Objects for everything, it autowraps references to primitives. Just like Java, the wrappers it uses are

Table 1. primitive wrappers

Primitive type      Wrapper class
boolean             Boolean

Groovy 自动包装基元,因此这是预期的行为。

同样由于自动换行,方法解析与 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)
    }
}

这会打印 "boolean was called".

我之前的回答仅在 Groovy 2.4.8 之前有效,所以我将保留原样。在 2.4.8 中,此行为已得到修复(参见 https://issues.apache.org/jira/browse/GROOVY-7933)。因此,此示例中解析方法的新顺序为:

1) 布尔值(环绕)

2) 布尔值

3) 对象