以下是Groovy文档“Differences from Java部分的摘录:
因为Groovy将Objects用于所有内容,所以它会自动对基元进行引用。因此,它不遵循Java的扩展行为优先于拳击。这是一个使用int
的例子int i
m(i)
void m(long l) {
println "in m(long)"
}
void m(Integer i) {
println "in m(Integer)"
}
对此没有太多解释。我无法将其粘贴到groovysh
并显示任何效果。
我真的是新的Groovy,并试图了解一个用例。
答案 0 :(得分:2)
并不是一个“用例”类型的东西,只是定义行为是什么。在您发布的示例中,方法m
都是使用i
作为参数调用的有效内容,因此编译器需要选择一个。
在Java中,它会更喜欢加宽(将数字类型转换为更大的数字类型,例如。int
到long
) boxing (将原始(非对象)类型放入对象框中,例如int
到Integer
)。因此,Java中的等效代码将执行采用long
。
然而,在Groovy中,原语已经包含在它们的Object等价物中,所以不需要发生拳击。这意味着Integer
方法被视为完全匹配,因此选择long
版本。
以一种方式做另一种方式没有任何实际优势;他们正在做的只是定义行为是什么,以便调用哪个版本不是未定义的行为。并且它在文档的该部分中得到特别注意,因为在Groovy中最有意义(并且最一致)的行为与Java中发生的行为不同。