2

为什么可以将原语传递给采用对象的方法?原语变成对象了吗?像 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;
    }
4

3 回答 3

4

是的,这叫做拳击转换。该int值被“装箱”到一个Integer中,这是一个Object。它从 1.5 开始在 Java 中可用。

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

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

  • 从布尔类型到布尔类型

  • 从类型字节到类型字节

  • 从短型到短型

  • 从 char 类型到 Character 类型

  • 从 int 类型到 Integer 类型

  • 从 long 类型到 Long 类型

  • 从浮点型到浮点型

  • 从双精度型到双精度型

  • 从空类型到空类型

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

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

  • 身份转换(§5.1.1)

  • 扩大的原始转换(§5.1.2)

  • 扩大参考转换(§5.1.5)

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

  • 一个拆箱转换(第 5.1.8 节)可选地后跟一个扩大的原始转换。

于 2013-10-15T16:43:29.627 回答
1

是的你可以。自动装箱/拆箱是由编译器自动完成的。这是文档的摘录。

自动装箱是 Java 编译器在原始类型与其对应的对象包装类之间进行的自动转换。例如,将 int 转换为 Integer,将 double 转换为 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
于 2013-10-15T16:43:23.893 回答
0

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

用于装箱和拆箱的 Oracle 文档

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

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

等等。

于 2013-10-15T16:43:58.973 回答