复合赋值的自动(非)装箱失败

时间:2010-04-24 13:05:04

标签: java compiler-errors autoboxing implicit-cast compound-assignment

由于复合赋值和递增/递减运算符中的隐式转换,以下编译:

byte b = 0;
++b; b++; --b; b--;
b += b -= b *= b /= b %= b;
b <<= b >>= b >>>= b;
b |= b &= b ^= b;

由于自动装箱和自动拆箱,以下内容也会编译:

Integer ii = 0;
++ii; ii++; --ii; ii--;
ii += ii -= ii *= ii /= ii %= ii;
ii <<= ii >>= ii >>>= ii;
ii |= ii &= ii ^= ii;

然而,以下代码段中的最后一行给出了编译时错误:

Byte bb = 0;
++bb; bb++; --bb; bb--; // ... okay so far!
bb += bb; // DOESN'T COMPILE!!!
// "The operator += is undefined for the argument type(s) Byte, byte"

任何人都可以帮我弄清楚这里发生了什么吗? byte b版本编译得很好,所以不应该Byte bb只是效仿,并根据需要进行适当的装箱和拆箱以适应?


额外的问题

那么有没有办法让复合赋值运算符在左侧与ByteCharacterShort一起使用,或者它们完全是非法的(!! !)这些类型?

1 个答案:

答案 0 :(得分:6)

标准的§ 5.1.7 (Boxing)部分说:

From type boolean to type Boolean
From type byte to type Byte
From type char to type Character
From type short to type Short
From type int to type Integer
From type long to type Long
From type float to type Float
From type double to type Double

注意没有int to Byte。当你执行bb + bb时,它会被转换为int + int,而不会被装箱回Byte。对于byte版本,int + int会直接转回byte(缩小原始转化次数§ 5.1.3),以便允许这样做。