複合代入とインクリメント/デクリメント演算子の暗黙的なキャストのおかげで、次のものがコンパイルされます。
byte b = 0;
++b; b++; --b; b--;
b += b -= b *= b /= b %= b;
b <<= b >>= b >>>= b;
b |= b &= b ^= b;
また、自動ボクシングと自動アンボックスのおかげで、以下もコンパイルされます。
Integer ii = 0;
++ii; ii++; --ii; ii--;
ii += ii -= ii *= ii /= ii %= ii;
ii <<= ii >>= ii >>>= ii;
ii |= ii &= ii ^= ii;
それでも、次のスニペットの最後の行でコンパイル時エラーが発生します。
Byte bb = 0;
++bb; bb++; --bb; bb--; // ... okay so far!
bb += bb; // DOESN'T COMPILE!!!
// "The operator += is undefined for the argument type(s) Byte, byte"
ここで何が起こっているのかを理解するのを手伝ってくれる人はいますか? バージョンはbyte b
問題なくコンパイルされるので、それByte bb
に合わせて、必要に応じて適切なボックス化とボックス化解除を行うべきではありませんか?
追加の質問
Byte
では、複合代入演算子を、Character
、およびShort
左側で機能させる方法はありますか、それともこれらの型に対して単に違法 (!!!)ですか?