Questo messaggio di errore del compilatore Java è errato? (perdita di precisione in byte)

2

Il seguente java program valido di IMHO non viene compilato perché il compilatore javac di Oracle 1.7 pensa che ci sia una possibile perdita di precisione nelle righe 5 e 6. Se disattivi la riga 3 e commenta la riga 4, questa viene compilata correttamente.

Qualcuno potrebbe spiegare perché il compilatore crede che vi sia una perdita di precisione nell'assegnazione al byte b2 o b3 ?

public class BUG {
    public static void main( String[] args ) {
        //final byte b1 = 9;
        byte b1 = 9;
        final byte b2 = -b1;    // fine if line 3 is uncommented and line 4 is commented
        final byte b3 = 0 - b1; // fine if line 3 is uncommented and line 4 is commented
    }
}

Se il mio codice di esempio è corretto, vorrei segnalarlo come un errore ma non riesco a scoprire dove. Qualcuno potrebbe spiegare cosa sta dicendo il messaggio di errore del compilatore in questo caso e perché è corretto?

    
posta Marc van Dongen 22.07.2013 - 13:03
fonte

1 risposta

11

Non è un bug, sta agendo esattamente come specificato.

Con final byte b1 il compilatore è sicuro che b1 avrà il valore 9 e -b1 diventa un espressione costante di tempo di compilazione . Il compilatore può quindi verificare che il valore sia ancora accettabile per un byte e facciamolo.

Quando b1 è not final allora -b1 è un'espressione come qualsiasi altra e come tale b1 sarà promosso a int (vedi JLS §5.6.1 Promozione unaria numerica ). E poiché la conversione da int a byte può può causare una perdita di precisione, il compilatore non lo consente (senza un cast esplicito).

    
risposta data 22.07.2013 - 13:21
fonte

Leggi altre domande sui tag