Авто (не) бокс не работает для составного назначения - PullRequest
8 голосов
/ 24 апреля 2010

Благодаря неявному приведению в составных присваиваниях и операторах увеличения / уменьшения, следующие компиляции:

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 с левой стороны, или они просто недопустимы (!!!) для эти типы?

1 Ответ

6 голосов
/ 24 апреля 2010

Раздел § 5.1.7 (Бокс) стандарта гласит:

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, которое не упаковывается обратно в Byte. Для версии byte int + int приводится непосредственно к byte (сужение примитивных преобразований, § 5.1.3 ), поэтому это разрешено.

...