为什么Java中的复合赋值运算符(+=, -=, *=)不需要显式类型转换?
大家好!我刚开始学习Java,遇到了一些让我困惑的行为。当我写普通的赋值时,例如:
int a = 5;
a = a + 3.5; // 编译错误:精度丢失
编译器会报错,说不能将double赋值给int而不进行显式转换。这很合理。但如果我使用复合运算符+=:
int a = 5;
a += 3.5; // 可以工作!结果是8
这里我就糊涂了。为什么第二种情况下编译器不需要强制类型转换?毕竟int和double相加的结果是double,而我们将其赋值给int时会丢失精度。按理说,应该像第一个例子一样报错。
为什么会这样?这是语言特性还是我遗漏了什么?使用这类运算符时有什么陷阱?例如,如果我写:
short s = 1;
s += 1; // 会工作吗?
或者:
byte b = 127;
b += 1; // 这里会发生什么?
希望能得到详细的解释,最好有示例。提前感谢!
<<>>