驚いたことに、次のコードは警告なしでコンパイルされることがわかりました。
public void test()
{
int value = 2000000000;
long increment = 1000000000;
value += increment;
}
予想どおり、これによりコンパイル時エラーが発生します。
public void test()
{
int value = 2000000000;
long increment = 1000000000;
value = value + increment;
}
私はそれを調べました、そして確かに、JLS(セクション15.26.2)はこれを言っています:
E1 op = E2の形式の複合代入式は、E1 =(T)((E1)op(E2))と同等です。ここで、TはE1のタイプですが、E1は1回だけ評価されます。
これは私にはばかげているようです。なぜ彼らはここで明示的にキャストする必要性を感じたのですか?とにかく自動型変換が拡大を処理したようであり、このように自動的に縮小すると、整数のオーバーフローが発生することがほぼ保証されます。