自从JDK 5.0以来,Java引入了自动装箱/拆箱。这个技巧简单又有用,但当我开始测试包装类和基本类型之间的不同转换时,我真的很困惑自动装箱的概念在Java中是如何工作的。例如:
装箱
int intValue = 0;
Integer intObject = intValue;
byte byteValue = 0;
intObject = byteValue; // ==> Error
在尝试不同情况(short
, long
, float
, double
)后,唯一被编译器接受的情况是右侧赋值操作符的值类型为int
。
当我查看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
)进行自动拆箱。我想知道这个结论是否正确,或者自动拆箱还有其他的概念?
byte byteValue = intObject;
- 无论intObject
是对象还是原始类型,您都意识到这是一个错误,对吗? - vanzaInteger.intValue()
方法来取消包装值,这正确吗? - Naruto Biju Mode