原始型铸造

时间:2013-06-07 20:18:00

标签: java

我最近一直在使用Java的字节原语,我遇到了一个愚蠢的问题:

byte a = 10;
byte b = 9;
byte c = 8;
b += b*c;    // how come this statement is correct without any explicit type casting
b =  b*c;    // while this statement is incorrect; it requires explicit cast, of course
b = b+(b*c); // this is wrong too.

所以我的问题是,+=是否指定除了添加和赋值之外的任何赋值,或者这是Java中的错误(我几乎可以肯定不是)?

2 个答案:

答案 0 :(得分:7)

因为b += b*c等同于b += (byte) ((b) + (b*c))

来自compound assignment operators上的Java语言规范:

  

E1 op = E2形式的复合赋值表达式等效于E1 =(T)((E1)op(E2)),其中T是E1的类型,但E1仅被评估一次。

答案 1 :(得分:6)

所有复合赋值运算符不仅执行操作,还会自动将其结果转换为左侧变量的类型。

所以你的+ =不仅会添加变量并分配结果 - 它还会将结果转换为正确的类型。