【发布时间】:2014-03-25 23:41:16
【问题描述】:
自 JDK 5.0 起,Java 中引入了自动装箱/拆箱。这个技巧很简单也很有帮助,但是当我开始测试包装类和原始类型之间的不同转换时,我真的很困惑自动装箱的概念在 Java 中是如何工作的。例如:
拳击
int intValue = 0;
Integer intObject = intValue;
byte byteValue = 0;
intObject = byteValue; // ==> Error
在尝试了不同的情况(short、long、float、double)之后,编译器唯一接受的情况是当做作运算符右边的值的类型是@987654327 @。
当我查看Integer.class 的源代码时,我发现它只实现了一个带有int 参数的构造函数。
所以我的结论是自动装箱的概念是基于在包装类中实现的构造函数。我想知道这个结论是真的还是自动装箱使用了另一个概念?
拆箱
Integer intObject = new Integer(0);
byte byteValue = intObject; // ==> Error (the same Error with short)
int intValue = intObject;
double doubleValue = intObject;
我关于拆箱的结论是包装类给出了对应类型的对象包装的值(Integer==>int),然后编译器使用转换原始类型的常用规则(byte => short => int => long => float => double)。
我想知道这个结论是真的还是自动开箱使用了另一个概念?
【问题讨论】:
-
您是否阅读了有关自动装箱的 Java 语言规范部分? docs.oracle.com/javase/specs/jls/se8/html/jls-5.html#jls-5.1.7
-
byte byteValue = intObject;- 无论intObject是对象还是原始类型,您都会意识到这是一个错误,对吧? -
我认为编译器使用方法
Integer.intValue()来拆箱包装的值,对吗? -
@LouisWasserman 非常感谢您的链接真的很有帮助,它回答了我的问题。
标签: java autoboxing unboxing