解释关于自动包装的原始文档(原语和包装器)

时间:2016-05-05 16:42:31

标签: java groovy

以下是Groovy文档“Differences from Java部分的摘录:

  1. 原语和包装
  2. 因为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,并试图了解一个用例。

1 个答案:

答案 0 :(得分:2)

并不是一个“用例”类型的东西,只是定义行为是什么。在您发布的示例中,方法m都是使用i作为参数调用的有效内容,因此编译器需要选择一个。

在Java中,它会更喜欢加宽(将数字类型转换为更大的数字类型,例如。intlong boxing (将原始(非对象)类型放入对象框中,例如intInteger)。因此,Java中的等效代码将执行采用long

的方法

然而,在Groovy中,原语已经包含在它们的Object等价物中,所以不需要发生拳击。这意味着Integer方法被视为完全匹配,因此选择long版本。

以一种方式做另一种方式没有任何实际优势;他们正在做的只是定义行为是什么,以便调用哪个版本不是未定义的行为。并且它在文档的该部分中得到特别注意,因为在Groovy中最有意义(并且最一致)的行为与Java中发生的行为不同。