許多開發者疑惑:為何 int i = 5; long j = 7; i = i + j; 編譯失敗,而 i += j; 卻能通過?
根據 JLS §15.26.2 Compound Assignment Operators 規定:
E1 op= E2等價於E1 = (T) ((E1) op (E2)),其中T為E1的類型。
int i = 5;
long j = 7;
// i = i + j → 編譯錯誤:long 無法隱式轉為 int
// i += j → 等價於 i = (int)(i + j) → 編譯通過,結果 12
| 運算子 | 等價展開 |
|---|---|
i -= j | i = (int)(i - j) |
i *= j | i = (int)(i * j) |
i /= j | i = (int)(i / j) |
++ 運算子無此行為,i++ 等價於 i = i + 1,若 i 為 byte/short/char 仍需顯式轉型。理解此機制有助於避免類型轉換相關的隱性 Bug。