2014-07-12 6 views
7
public static void main(String[] args) { 

    final int a =15; 
    byte b = a; 
    System.out.println(a); 
    System.out.println(b); 
} 

Nel codice di cui sopra quando mi sono la conversione da int a byte non sta dando compilazione errore di tempo, ma quando mia conversione è da lungo a int è dare il tempo di compilazione errore, PERCHÉ?tipo di problema cast int a byte utilizzando parola chiave final in Java

public static void main(String[] args) { 

    final long a =15; 
    int b = a; 
    System.out.println(a); 
    System.out.println(b); 
} 
+2

È solo un'altra verruca sull'architettura. Ci sono molti. Alcuni hanno una "ragione" - la maggior parte no. –

risposta

11

Da the JLS section on assignment conversions:

Inoltre, se l'espressione è una costante espressione di tipo byte, short, char o int:

  • Un ambito conversione primitivo può essere utilizzata se il tipo della variabile è byte, short o char, e la val la costante dell'espressione è rappresentabile nel tipo della variabile.

quando si sta dichiarando e inizializzare il vostro final a, questo è un momento della compilazione espressione costante, e il compilatore può determinare che il valore 15 si adatta in modo sicuro in un byte. Il JLS semplicemente non consente conversioni di restringimento implicito da long, senza spiegazione, e questa regola risale almeno a Java 2 (il primo JLS che potrei trovare ovunque).

Vorrei ipotizzare che questa logica possa derivare dal fatto che il bytecode Java è definito per una dimensione di parola di 32 bit e che le operazioni su un long sono logicamente più complicate e costose.