Java int + =双语法惊喜

我遇到了以下令人惊讶的问题:

int x = 7; x += 0.5; 

显然是合法的语法! 在添加之后,x仍然是7,因此double被强制转换为int并向下舍入为0,但这在代码中没有任何显式强制转换的情况下完成。 有人对此感到惊讶吗? 这里的理由是什么?

编辑以澄清我的问题:任何人都可以给出这个决定的充分理由吗? 我觉得这是一个需要在其他地方进行显式投射的可怕决定,但是在你默默抛弃数据的语言中有这一点。 我错过了什么吗?

 x += 0.5; 

相当于:

 x = (int) (x + 0.5) 

一般来说:

x += y等于x = (type of x) (x + y)


见15.26.2。 复合赋值运算符

x += 0.5;x = (int) (x + 0.5);

这是因为复合赋值运算符会进行隐式转换 (自动转换):所以

 x+=0.5 => x =(int)(x + 0.5) => x = (int)(7.5) => x = 7