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