"+ ="运算符和int长期使用

cod*_*der 7 java

int a = 1L;
Run Code Online (Sandbox Code Playgroud)

这不编译(当然). 不兼容的类型:从long到int的可能有损转换

int b = 0;
b += Long.MAX_VALUE;
Run Code Online (Sandbox Code Playgroud)

这确实编译了!

但为什么允许这样做呢?

Sur*_*tta 10

当你这样做时+=,复合语句和编译器在内部强制转换它.在第一种情况下,编译器直接向你喊叫,因为它是直接声明:)

这条线

b += Long.MAX_VALUE;
Run Code Online (Sandbox Code Playgroud)

编译器版本相当于

b += (int)Long.MAX_VALUE;
Run Code Online (Sandbox Code Playgroud)

当然,从long转换为int会有损耗转换.

http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.26.2

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