对字节添加和赋值的有趣观察

时间:2012-03-06 05:40:49

标签: java casting

今天在帮助某人的过程中,我遇到了一个有趣的问题,我无法理解其中的原因。 使用+ =时我们不需要显式转换,但是当我们使用i + i时,我们需要显式转换。找不到确切的原因。任何意见都将不胜感激。

public class Test{
       byte c = 2;
       byte d = 5;

       public  void test(String args[])
       {
           c += 2;
           d = (byte) (d + 3);   
       }
    }

2 个答案:

答案 0 :(得分:8)

Java定义为+ =,其他复合赋值运算符自动将结果转换为要更新的变量的类型。因此,使用+ =时不需要强制转换,但只需使用普通运算符即可。您可以在http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.26.2

的Java语言规范中看到这一点

具体来说,表达方式

a op= b

相当于

(a = (type of a)((a) op (b));

希望这有帮助!

答案 1 :(得分:1)

来自Java Language Spec, Chapter 15

  

[..]二进制操作的结果(注意:(c+2)在我们的示例中,导致int类型值)被转换为类型左侧变量(注意:在我们的示例中为byte,受到值集转换(第5.113节)到相应的标准值集(不是扩展指数值) set),转换结果存储在变量中。