¿Por qué no puedo agregar dos bytes y obtener un int y puedo agregar dos bytes finales para obtener un byte?

public class Java{ public static void main(String[] args){ final byte x = 1; final byte y = 2; byte z = x + y;//ok System.out.println(z); byte a = 1; byte b = 2; byte c = a + b; //Compiler error System.out.println(c); } } 

Si el resultado de una expresión que involucra cualquier tamaño int o más pequeño es siempre un int incluso si la sum de dos bytes encaja en un byte.

¿Por qué sucede cuando agregamos dos bytes finales que caben en un byte? No hay error de comstackdor

De la Conversión de Asignación de JLS 5.2

Además, si la expresión es una expresión constante (§15.28) de tipo byte, short, char o int : – Se puede usar una conversión de primitiva de estrechamiento si el tipo de la variable es byte, short o char, y el valor de la expresión constante es representable en el tipo de la variable.

En resumen, el valor de la expresión (que se conoce en tiempo de comstackción, porque es una expresión constante) es representable en el tipo de la variable que es byte.

Considera tu expresión

  final byte x = 1; final byte y = 2; byte z = x + y;//This is constant expression and value is known at compile time 

Entonces, como la sumtoria cabe en byte, no genera un error de comstackción.

Ahora si lo haces

 final byte x = 100; final byte y = 100; byte z = x + y;// Comstacktion error it no longer fits in byte 
 byte z = x + y; // x and y are declared final 

Aquí, dado que y se declaran final se conoce el valor de expresión en el RHS en tiempo de comstackción, que se fija en (1 + 2 = 3) y no puede variar. Entonces, no necesita encasillarlo explícitamente

 byte c = a + b; // a and b are not declared final 

Mientras que, en este caso, el valor de b no se declara final. Entonces, el valor de la expresión no se conoce en tiempo de comstackción, sino que se evalúa en tiempo de ejecución. Entonces, necesitas hacer un lanzamiento explícito.


Sin embargo, incluso en el primer código, si el valor de a + b sale fuera del rango -128 to 127 , no podrá comstackrse.

 final byte b = 121; final byte a = 120; byte x = a + b; // This won't compile, as `241` is outside the range of `byte` final byte b1 = 12; final byte a1 = 12; byte x1 = a1 + b1; // Will Compile. byte can accommodate `24`