8

複合代入とインクリメント/デクリメント演算子の暗黙的なキャストのおかげで、次のものがコンパイルされます。

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左側で機能させる方法はありますか、それともこれらの型に対して単に違法 (!!!)ですか?

4

1 に答える 1

6

標準のセクション§ 5.1.7 (Boxing)には次のように記載されています。

From type boolean to type Boolean
From type byte to type Byte
From type char to type Character
From type short to type Short
From type int to type Integer
From type long to type Long
From type float to type Float
From type double to type Double

がないことに注意してくださいint to Byte。これを行うbb + bbと、 int + int に変換されますが、これは にボックス化されていませんBytebyteバージョンについては、直接int + intキャストバックされるためbyte(プリミティブ変換の絞り込み、§ 5.1.3 )、許可されます。

于 2010-04-24T13:31:03.963 に答える