java - 解释有关自动包装(基元和包装器)的 groovy 文档

标签 java groovy

以下是 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中,它会更喜欢加宽(将数字类型转换为更大的数字类型,例如intlong)而不是< em>装箱(将原始(非对象)类型放入对象框中,例如intInteger)。因此,Java 中的等效代码将执行需要 long 的方法。

    但是,在 Groovy 中,基元已经包装在其等效对象中,因此不需要进行装箱。这意味着 Integer 方法被视为完全匹配,因此会选择 long 版本。

    采用一种方式相对于另一种方式并没有真正的优势;他们所做的只是定义行为是什么,这样调用哪个版本就不是未定义的行为。它在文档的该部分中得到了特别注意,因为 Groovy 中最有意义(并且最一致)的行为与 Java 中发生的行为不同。

    关于java - 解释有关自动包装(基元和包装器)的 groovy 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37055883/

    相关文章:

    java - 在 ListView 中限制项目

    java - 通过 Java 应用程序从内部调用命令行工具

    grails - Grails war 中的Groovy旧版本

    java - "Array index is out of bounds"在 Groovy 中异常的 super 调用

    java - 在 java 中写入文件时加密 XML 元素

    java - Java 中的生产者/消费者。为什么我们需要两个条件?

    grails - 在Save()上引用 Controller 中的相关记录ID

    java - 从 Java 应用程序使用 Groovy 库

    grails - 创建自定义Grails Tag Lib生成代码

    java - 如何在CouchDB中实现关键字搜索