Aunque los operadores aritméticos se definen para operar en cualquier tipo numérico, de acuerdo con la especificación de lenguaje Java (5.6.2 Promoción binaria numérica), los operandos de tipo byte y corto se promueven automáticamente a int antes de entregarse a los operadores.
Para realizar operaciones aritméticas en variables de tipo byte o corto, debe encerrar la expresión entre paréntesis (dentro de las cuales las operaciones se llevarán a cabo como tipo int) y luego devolver el resultado al tipo deseado.
byte a = 23;
byte b = 34;
byte c = (byte) (a + b);
Aquí hay una pregunta de seguimiento para los gurús reales de Java: ¿por qué? Los tipos byte y short son tipos numéricos perfectamente precisos. ¿Por qué Java no permite operaciones aritméticas directas en estos tipos? (La respuesta no es "pérdida de precisión", ya que no hay ninguna razón aparente para convertir a int en primer lugar.)
Actualización: jrudolph sugiere que este comportamiento se basa en las operaciones disponibles en la JVM, específicamente, que solo se implementan operadores de palabra completa y de doble palabra. Por lo tanto, para el operador en bytes y cortos, se deben convertir a int.
IIRC La JVM almacena bytes y cortos como ints, por lo que generalmente se obtienen muy pocos beneficios con el uso de estos dos tipos de datos. Por supuesto, me doy cuenta de que estás haciendo algo mucho más complejo que tu ejemplo y probablemente tengas una muy buena razón. –