1. ホーム

[解決済み】なぜJavaの+=, -=, *=, /=複合代入演算子はキャスティングを必要としないのですか?

2022-05-01 18:13:40

質問

今日まで、たとえばこんな風に思っていました。

i += j;

のショートカットだけでした。

i = i + j;

でも、これを試したら。

int i = 5;
long j = 8;

その後 i = i + j; はコンパイルされませんが i += j; は正常にコンパイルされます。

ということなのでしょうか。 i += j; は、次のようなショートカットです。 i = (type of i) (i + j) ?

どのように解決するのですか?

この手の問題ではいつもそうだが、答えはJLSが握っている。この場合 §15.26.2 複合代入演算子 . 抜粋したものです。

複合代入式は次のような形式です。 E1 op= E2 は次のように等価です。 E1 = (T)((E1) op (E2)) ここで T のタイプです。 E1 ただし E1 は一度だけ評価されます。

以下はその例です。 §15.26.2

[...] 次のコードは正しいです。

short x = 3;
x += 4.6;

と等価であるため、結果的にxは値7を持つことになります。

short x = 3;
x = (short)(x + 4.6);

つまり、あなたの仮説は正しいのです。