参见英文答案 >
why byte += 1 compile but byte = byte + 1 not?8个
为什么
以下内容有效
为什么
以下内容有效
byte i=0; i++;
其中以下内容无效
byte i=0; i=i+1;
会是什么原因?
我知道在i 1的情况下,整个值显式递增1(这将是int值),因此将发生编译问题,但是在i的情况下它会做同样但没有得到任何错误.
解决方法
每当您在两个不同类型的操作数之间执行二进制操作时,其中一个操作数将被提升为更高类型.然后操作的结果就是那种类型.
因此,在您的情况下,字节类型a首先被提升为int,因为1是int类型.然后在加法运算之后,结果是int类型.现在,由于您无法为一个字节分配int,因此需要进行类型转换以删除编译器错误:
byte a = 2; a = a + 1; // Error: Cannot assign an int value to byte a = (byte)(a + 1); // OK
现在,在复合赋值运算符的情况下,类型转换是为您隐式完成的.表达方式:
a += 1
内部转换为:
a = (byte)(a + 1);
这在JLS-§15.26.2 Compound Assignment Operator:中指定
形式E1 op = E2的复合赋值表达式等效于E1 =(T)((E1)op(E2)),其中T是E1的类型,除了E1仅被评估一次.
前缀增量运算符和后缀增量运算符的情况类似.
根据JLS – §15.15 Unary Operators:
前缀增量表达式的类型是变量的类型.