以下是 Groovy 文档的摘录 Differences from Java部分:
- 基元和包装器
因为 Groovy 使用对象来处理所有事情,所以它会自动包装对基元的引用。因此,它不遵循 Java 的加宽优先于装箱的行为。这是一个使用 int 的示例
int i
m(i)
void m(long l) {
println "in m(long)"
}
void m(Integer i) {
println "in m(Integer)"
}
对此没有太多解释。我无法将其粘贴到 groovysh 中并显示任何效果。
我真的是 Groovy 新手,并试图理解它的用例。
最佳答案
与其说它是一个“用例”类型的东西,不如说它只是定义了行为是什么。在您发布的示例中,两个方法 m
都是使用 i
作为参数调用的有效方法,因此编译器需要选择一个。
在Java中,它会更喜欢加宽(将数字类型转换为更大的数字类型,例如int
到long
)而不是< em>装箱(将原始(非对象)类型放入对象框中,例如int
到Integer
)。因此,Java 中的等效代码将执行需要 long
的方法。
但是,在 Groovy 中,基元已经包装在其等效对象中,因此不需要进行装箱。这意味着 Integer
方法被视为完全匹配,因此会选择 long
版本。
采用一种方式相对于另一种方式并没有真正的优势;他们所做的只是定义行为是什么,这样调用哪个版本就不是未定义的行为。它在文档的该部分中得到了特别注意,因为 Groovy 中最有意义(并且最一致)的行为与 Java 中发生的行为不同。
关于java - 解释有关自动包装(基元和包装器)的 groovy 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37055883/