自动装箱不包装

Autoboxing not to wrapper

Object a = 3;
System.out.println(a.getClass().getName());

为什么a现在是整数?为什么不兼容的类型编译错误? Java 教程明确指出:

Autoboxing is the automatic conversion that the Java compiler makes between the primitive types and their corresponding object wrapper classes.

为什么 Java 在这种情况下将“3”自动装箱为整数?

我看不出有任何编译错误的原因。一旦本例中的基本类型 3 自动装箱为其包装类型 Integer,就不会有任何编译错误,因为 Integer 隐式继承自 Object,这意味着您可以轻松地将类型 Integer 的任何对象分配给类型 Object.

I don't understand why primitive type '3' is autoboxed to its wrapper type Integer.

它必须是自动装箱的,否则,你不能将原始类型分配给类型Object。由于接收类型是 Object 类型(reference 类型),因此必须自动装箱 primitive 类型以使其兼容。因此,您可以将 reference 类型分配给 reference 类型。

这适用于您遇到的大多数其他对象;只要两个对象之间有共同的祖先,就可以将一个分配给另一个。这被称为 is-a,并因其所回答的问题而得名。 Integer 是一个 Object

自动装箱只是采用原始类型并将其转换为自身的对象包装器表示。没有信息丢失,编译器将原语强制转换为 Object。因此,您的分配是合法的。

如果两个对象之间没有直接关系,那么您会遇到编译错误。

例如:

String a = 3;

...会导致编译错误,因为 Integer 无法分配给 String

You may peruse other autoboxing rules here,但还有一件事:所有非十进制数都被假定为 int,除非它们以 Ll 为后缀,其中如果他们是 long.