Нет оператора + для byte
. Вместо этого оба операнда переводятся в int, поэтому вы получаете
byte = byte + byte
... becomes (widening to find + operator) ...
byte = int + int
... becomes (result of + operator) ...
byte = int
... который затем завершается ошибкой, потому что нет неявного преобразования из int
в byte
. Вам необходимо разыграть:
byte a = 1;
byte b = 2;
byte c = (byte) (a + b);
Вот фактические правила для числового продвижения из раздела 5.6.2 JLS :
Когда оператор применяет двоичное числовое продвижение к паре операндов, каждый из которых должен обозначать значение, которое может быть преобразовано в числовой тип, применяются следующие правила в порядке использования расширяющегося преобразования (§5.1.2) для преобразования операнды по мере необходимости:
- Если какой-либо из операндов относится к ссылочному типу, выполняется преобразование без распаковки (§5.1.8). Тогда:
- Если один из операндов имеет тип double, другой преобразуется в двойной.
- В противном случае, если один из операндов имеет тип float, другой преобразуется в float.
- В противном случае, если один из операндов имеет тип long, другой преобразуется в long.
- В противном случае оба операнда преобразуются в тип int.