为什么byte + = 1编译但是byte = byte + 1不?

21 java types

如果我有一个字节变量: byte b = 0;

为什么以下工作:

   b++;
   b += 1; // compiles
Run Code Online (Sandbox Code Playgroud)

......但这不是吗?

   b = b + 1; // compile error
Run Code Online (Sandbox Code Playgroud)

编译器首先理解为byte第二个和第二个int吗?

[编辑]

我知道铸造,但我想引起你的注意 b++, b += 1 and b = b + 1

我认为它们是平等的,为什么编译器会有所不同?有什么区别

  b += 1 and b = b + 1 ?
Run Code Online (Sandbox Code Playgroud)

axt*_*avt 25

因为b += 1是等价的b = (byte)(b + 1),而类型b + 1被提升为int(JLS§5.6.2二进制数字促销),因此byte如果没有显式转换,其结果将无法分配.

来自JLS,§15.26.2复合赋值算子:

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