【问题标题】:Why can I pass a primitive to a method that takes an object?为什么我可以将原语传递给采用对象的方法?
【发布时间】:2013-10-23 13:42:01
【问题描述】:

为什么可以将原语传递给接受对象的方法?原语变成对象了吗?比如 int = Integer 和 boolean = Boolean?

我可以调用以下函数:

hash(41, 0);

    public static int hash(int seed, Object object)
    {
        int result = seed;
        if(object == null)
        {
            return hash(result, 0);
        }
        else if(!isArray(object))
        {
            result = hash(result, object.hashCode());
        }
        else
        {
            int length = Array.getLength(object);
            for(int index = 0; index < length; ++index)
            {
                Object item = Array.get(object, index);
                // prevent looping if item in array references the array itself
                if(!(item == object))
                {
                    result = hash(result, item);
                }
            }
        }
        return result;
    }

【问题讨论】:

  • 你是在用 hash(41, 0) 调用 hash(int seed, Object object) 吗?

标签: java pass-by-reference primitive pass-by-value


【解决方案1】:

是的,这称为装箱转换int 值被“装箱”成 Integer,即 Object。它从 1.5 开始在 Java 中可用。

JLS, Section 5.1.7 列出了可用的拳击转换:

装箱转换将原始类型的表达式转换为 引用类型的对应表达式。具体来说, 以下九种转换称为拳击转换:

  • 从布尔型到布尔型

  • 从类型字节到类型字节

  • 从短类型到短类型

  • 从char类型到Character类型

  • 从 int 类型到 Integer 类型

  • 从 long 类型到 Long 类型

  • 从浮点型到浮点型

  • 从双精度型到双精度型

  • 从空类型到空类型

此外,在方法调用转换期间允许装箱转换,这正是这里发生的事情。该值正在转换为另一种类型,因为 int 0 正在传递给需要 Object 的方法。 JLS, Section 5.3,将装箱转换列为方法调用转换的一种方法:

方法调用上下文允许使用以下之一:

  • 身份转换 (§5.1.1)

  • 加宽基元转换 (§5.1.2)

  • 扩大参考转换 (§5.1.5)

  • 一个装箱转换(第 5.1.7 节)可选地后跟扩大参考 转化

  • 一个拆箱转换 (§5.1.8) 可选地后跟一个加宽 原始转换。

【讨论】:

    【解决方案2】:

    是的,你可以。称为autoboxing/unboxing 的东西是由编译器自动完成的。这是文档的摘录。

    自动装箱是 Java 编译器进行的自动转换 在原始类型及其对应的对象包装器之间 类。例如,将 int 转换为 Integer,将 double 转换为 双倍,以此类推。如果转换以另一种方式进行,这是 称为拆箱。

    int i = 1;
    Integer boxI = i; // Autoboxing is performed automatically by the compiler
    
    Integer ii = 1;
    int i = ii; // Auto(un)boxing is performed automatically by the compiler
    

    【讨论】:

      【解决方案3】:

      是的,原语转换为对象,反之亦然,这个概念称为装箱和拆箱。在较新版本的 java 中,这是自动完成的,因此称为自动装箱和自动拆箱。

      Oracle doc for Boxing and UnBoxing

      每个原语都有对应的 Wrapper 类。

      • int -> 整数
      • 布尔值 -> 布尔值
      • 字符 -> 字符

      等等。

      【讨论】:

        猜你喜欢
        • 2020-02-10
        • 2016-11-20
        • 1970-01-01
        • 1970-01-01
        • 2021-09-07
        • 2011-12-12
        • 2017-10-09
        • 1970-01-01
        • 2015-02-03
        相关资源
        最近更新 更多