为什么我可以将原语传递给接受对象的方法?

Ton*_*ony 2 java primitive pass-by-reference pass-by-value

为什么可以将原语传递给接受对象的方法?原始变成了一个对象吗?像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;
    }
Run Code Online (Sandbox Code Playgroud)

rge*_*man 5

是的,这称为拳击转换.该int值被"装箱"成一个Integer,这是一个Object.它从1.5开始就在Java中提供.

JLS,第5.1.7节列出了可用的装箱转换:

拳击转换将基本类型的表达式转换为引用类型的相应表达式.具体来说,以下九个转换称为装箱转换:

  • 从类型布尔值到类型布尔值

  • 从类型字节到类型字节

  • 从短类型到短类型

  • 从类型char到类型字符

  • 从int类型到Integer类型

  • 从类型long到类型Long

  • 从类型float到类型Float

  • 从double类型到Double类型

  • 从null类型到null类型

此外,在方法调用转换期间允许装箱转换,这正是这里发生的事情.该值正在转换为另一种类型,因为int 0它被传递给期望的方法Object.的JLS,第5.3节,列出装箱转换为方法调用转换的一个方法:

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

  • 身份转换(§5.1.1)

  • 扩展的原始转换(第5.1.2节)

  • 扩大参考转换(第5.1.5节)

  • 一个拳击转换(§5.1.7)可选地后面加宽引用转换

  • 一个拆箱转换(第5.1.8节),可选地后跟一个加宽的基元转换.