没有+运算符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);
这是JLS的5.6.2节中数字推广的实际规则:
当运算符将二进制数值提升应用于一对操作数时,每个操作数必须表示一个可转换为数字类型的值,以下规则适用,以便根据需要使用加宽转换(第5.1.2节)来转换操作数:
如果任何一个操作数是引用类型,则执行装箱转换(第5.1.8节)。然后:
如果一个操作数的类型为double,则另一个将转换为double。
否则,如果其中一个操作数的类型为float,则另一个将转换为float。
否则,如果其中一个操作数的类型为long,则另一个将转换为long。
否则,两个操作数都将转换为int类型。