Avatar ·

为什么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语言规范。