我在Java中有以下代码:
class Boxing
{
public static void main(String args[])
{
short s = 10;
Integer iRef = s;
}
}
为什么在编译时会产生错误?如果我明确地将short缩写为表达式中的整数,则会成功编译。因为我在表达式中使用short不是默认情况下应该是整数的类型而不需要显式的大小写?
答案 0 :(得分:13)
你想在这里发生两件事:加宽和自动装箱。
不幸的是,Java只会自动执行两者中的一个。其原因很可能是相当晚推出了自动装箱(在Java5中),他们必须小心不要破坏现有的代码。
你可以做到
int is = s; // widening
Short sRef = s; // autoboxing
Integer iRef = (int) s; // explicit widening, then autoboxing
答案 1 :(得分:1)
拳击转换将基本类型的表达式转换为引用类型的相应表达式。具体来说,以下九个转换称为装箱转换:
从类型布尔值到类型布尔
从类型字节到类型字节
从短类型到短类型
从char类型到Character
从int类型到Integer类型
从long类型到Long
从float类型到Float类型
从double类型到Double
从null类型到null类型
答案 2 :(得分:1)
以下是JLS 5.1.7
的文档拳击转换将基本类型的表达式转换为引用类型的相应表达式。具体来说,以下九个转换称为装箱转换:
从类型布尔值到类型布尔
从类型字节到类型字节
从短类型到短类型
从char类型到Character
从int类型到Integer类型
从long类型到Long
从float类型到Float类型
从double类型到Double
从null类型到null类型
基本上,从short
到Integer
的直接转换不属于Java
的自动装箱过程。
如上所述,自动装箱只能将表示基元类型隐含地表示为表示Wrapper类。由于情况并非如此,因此会导致编译时错误。
答案 3 :(得分:0)
Java尝试执行自动加宽,然后自动装箱,然后自动向上投射,但是对于同一分配,将不会执行其中的两个操作。对于方法参数分配的相关情况,对此进行了here的解释和图示。