为什么b = b + 1当b是一个字节时不会编译但b + = 1编译

Mad*_*ath 4 java

这是我的代码:

class Example{
    public static void main(String args[]){
        byte b=10;
        //b=b+1; //Illegal
        b+=1;   //Legal
        System.out.println(b);
    }
}
Run Code Online (Sandbox Code Playgroud)

我想知道为什么我在使用时遇到编译错误b=b+1,但另一方面b+=1在他们似乎做同样的事情时正确编译.

Yar*_*Yar 5

这是个有趣的问题.见JLS 15.26.2.复合赋值运算符:

除了 仅计算一次之外,表单的复合赋值表达式E1 op= E2等效于E1 = (T) ((E1) op (E2)),where T的类型.E1E1

因此,在编写时b+=1;,您实际上是将结果转换为a byte,这是类似的表达式(byte)(b+1),编译器将知道您在说什么.相比之下,当你使用时,b=b+1你会添加两种不同的类型,因此你会得到一个Incompatible Types Exception.