为什么Java中的复合赋值运算符 +=、-=、*= 不需要显式类型转换?
大家好!我最近开始学习Java,遇到了一个令人困惑的行为。假设我有以下代码:
```java
int a = 5;
long b = 10L;
a = a + b; // 编译错误:incompatible types: possible lossy conversion from long to int
```
这里一切都很合理——Java要求显式转换,因为`long`可能比`int`大。但如果我使用复合运算符:
```java
int a = 5;
long b = 10L;
a += b; // 运行无误!
```
为什么会这样?从逻辑上讲,`a += b` 等同于 `a = a + b`。但编译器接受第二个版本而不需要转换,尽管类型相同。这让我很困惑,因为我以为Java对类型检查很严格。请解释一下其中的玄机?是否存在可能导致数据丢失或bug的情况?
<<>>
为什么复合赋值运算符不需要类型转换?
你说得对——乍一看这似乎违反了严格类型检查。实际上,这完全取决于Java语言规范。