为什么可以将原语传递给接受对象的方法?原始变成了一个对象吗?比如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;
}
答案 0 :(得分:5)
是的,这称为拳击转换。 int
值被“加框”为Integer
,即Object
。它从1.5开始就在Java中提供。
JLS, Section 5.1.7列出了可用的装箱转换:
拳击转换将基本类型的表达式转换为 相应的引用类型表达式。具体来说, 以下九次转换被称为拳击转换:
从类型布尔值到类型布尔
从类型字节到类型字节
从短类型到短类型
从char类型到Character
从int类型到Integer类型
从long类型到Long
从float类型到Float类型
从类型double到类型Double
从null类型到null类型
此外,在方法调用转换期间允许装箱转换,这正是这里发生的事情。该值正在转换为另一种类型,因为int
0
正在传递给期望Object
的方法。 JLS, Section 5.3,将装箱转换列为方法调用转换的一种方法:
方法调用上下文允许使用以下之一:
身份转换(第5.1.1节)
扩大原始转换(第5.1.2节)
扩大参考转换(第5.1.5节)
拳击转换(§5.1.7),可选地后跟加宽引用 转化
取消装箱转换(第5.1.8节),可选地后跟加宽 原始转换。
答案 1 :(得分:1)
是的,你可以。名为autoboxing/unboxing的东西由编译器自动完成。以下是文档的摘录。
Autoboxing是Java编译器自动转换 原始类型与其对应的对象包装器之间 类。例如,将int转换为Integer,将double转换为a 双,等等。如果转换是另一种方式,那就是 称为拆箱。
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
答案 2 :(得分:0)
是的,原始转换为Object,反之亦然,这个概念称为装箱和拆箱。在较新版本的java中,这是自动完成的,因此称为自动装箱和自动拆箱。
Oracle doc for Boxing and UnBoxing
每个原语都有相应的Wrapper类。
等等。