2015-11-11 8 views
9

La seguente riga di codice viene accettato dal compilatore (sun-jdk-8u51) senza eventuali avvisi o errori:Perché la conversione restringimento da int a breve non funziona se la variabile locale viene utilizzato nella operatore ternario

short b = true ? 1 : 1; 

considerando che le prossime due linee di codice portano ad un errore di compilazione (tipi incompatibili: possibile conversione lossy da int a breve):

boolean bool = true; 
short s = bool ? 1 : 1; 

Perché il compilatore non è in grado di eseguire lo stesso narrowing conversion della p intero rimitivo 1 nel secondo caso?

+11

Questo perché nel primo caso, dal momento che 'true' è un momento della compilazione costante, l'intera espressione viene valutata durante la fase di compilazione, in modo da avere praticamente' breve b = 1; ' mentre nella seconda versione, il compilatore non fa la semplificazione per te, quindi l'errore. – aioobe

+1

Correlati (possibilmente dupe): http://stackoverflow.com/questions/4711431/unexpected-output-when-using-a-ternary-operator-and-final-variable – aioobe

+0

[conversione di assegnazione] (http: // docs. oracle.com/javase/specs/jls/se8/html/jls-5.html#jls-5.2) - se l'espressione è un'espressione costante ... è possibile utilizzare la conversione primitiva restringente ... – ZhongYu

risposta

3

come indicato dalla @aioobe nei commenti:

Questo perché nel primo caso, dal momento che true è un tempo di compilazione costante, l'intera espressione viene valutata durante la fase di compilazione, in modo da avere praticamente short b = 1; mentre nella seconda versione, il compilatore non fa semplificazione per voi, quindi l'errore

Aggiunta final alla dichiarazione della variabile bool rende una variabile costante, che permette anche il compilatore di all'interpretazione t il codice come menzionato sopra.

final boolean bool = true; 
short s = bool ? 1 : 1; 

Vedi section 4.12.4

Problemi correlati