Perché non posso aggiungere due byte e ottenere un int e posso aggiungere due byte finali ottenere 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); } } 

Se il risultato di un’espressione che coinvolge qualcosa di int-sized o più piccolo è sempre un int anche se la sum di due byte si adatta a un byte.

Perché succede quando aggiungiamo due byte finali che si adattano a un byte? Non c’è nessun errore del compilatore.

Dalla conversione di assegnazione di JLS 5.2

Inoltre, se l’espressione è un’espressione costante (§15.28) di tipo byte, short, char o int : – Una conversione primitiva restrittiva può essere utilizzata se il tipo della variabile è byte, short o char e il valore dell’espressione costante è rappresentabile nel tipo della variabile.

In breve, il valore dell’espressione (che è noto al momento della compilazione, poiché è un’espressione costante) è rappresentabile nel tipo della variabile che è il byte.

Considera la tua espressione

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

Quindi, poiché la sumtoria si adatta al byte, non genera un errore di compilazione.

Ora se lo fai

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

Qui, poiché x e y sono dichiarati final quindi il valore dell’espressione sul RHS è noto al momento della compilazione, che è fissato a (1 + 2 = 3) e non può variare. Quindi, non è necessario tipizzarlo in modo esplicito

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

Mentre in questo caso, il valore di b non è dichiarato definitivo. Quindi, il valore di espressione non è noto al momento della compilazione, ma viene valutato in fase di esecuzione. Quindi, devi fare un cast esplicito.


Tuttavia, anche nel 1 ° codice, se il valore di a + b risulta fuori dall’intervallo da -128 to 127 , non riuscirà a compilare.

 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`