Авто (ООН), упаковывающая сбой для составного присвоения

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

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

8
задан polygenelubricants 25 April 2010 в 03:33
поделиться

1 ответ

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

6
ответ дан 5 December 2019 в 22:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: