Благодаря неявному кастингу в составных присвоениях и инкременте/операторах понижения, следующих компиляциях:
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
на левой стороне, или они просто недопустимый (!!!) для этих типов?
Раздел § 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 ), поэтому разрешается.