为什么Java增量运算符允许在没有显式转换的情况下缩小操作?

Cri*_*scu 26 java precision compiler-errors

可能重复:
Java + =运算符

在Java中,这是无效的(不编译),如预期的那样:

long lng = 0xffffffffffffL;
int i;
i = 5 + lng;    //"error: possible loss of magnitude"
Run Code Online (Sandbox Code Playgroud)

但这很好(?!)

long lng = 0xffffffffffffL;
int i = 5;
i += lng;       //compiles just fine
Run Code Online (Sandbox Code Playgroud)

这显然是一个缩小的操作,可能超出int范围.那么编译器为什么不抱怨呢?

ass*_*ias 14

这在JLS#15.26.2中定义:

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

换句话说,i += lng隐式执行演员表.

  • @GanGnaMStYleOverFlowErroR你刚才改写了OP的问题.assylias被引用来引用JLS.与你相反,他在第一次**版本中发布了这个版本,并且是第一个发布它的版本; 你需要大约5次修改才能到达那里(并且只有在看到别人的答案之后). (2认同)

Per*_*ror 5

i += lng; 复合赋值运算符强制隐式转换。

i+=lng; 
is same as 
i = int(i+lng);
Run Code Online (Sandbox Code Playgroud)

JLS

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