2015-11-23 12 views
7

ho il seguente codice in Java:Perché l'assegnazione di una variabile breve a un riferimento Integer produce un errore di compilazione?

class Boxing 
    { 
     public static void main(String args[]) 
     { 
      short s = 10; 
      Integer iRef = s; 
     } 
    } 

Perché si produce un errore di compilazione? Se esprimo esplicitamente il corto con un numero intero nell'espressione, esso viene compilato correttamente. Dal momento che sto usando un cortometraggio in un'espressione non è il tipo di quello che si suppone essere un intero di default senza richiedere il caso esplicito?

+0

Farei 'int iRef = s'. –

+4

Questa non è la mia domanda. La mia domanda è perché Integer iRef = s non funziona. –

risposta

12

Desiderate che due cose accadano qui: ampliamento e auto-boxing.

Sfortunatamente, Java esegue solo uno dei due automaticamente. La ragione è che molto probabilmente l'autoboxing è stato introdotto abbastanza tardi (in Java5), e hanno dovuto fare attenzione a non violare il codice esistente.

Si può fare

int is = s; // widening 

Short sRef = s; // autoboxing 

Integer iRef = (int) s; // explicit widening, then autoboxing 
1

La conversione di boxing converte le espressioni di tipo primitivo in corrispondenti espressioni di tipo di riferimento. In particolare, i seguenti nove conversioni sono chiamate le conversioni di pugilato:

Dal tipo booleano di tipo booleano

Dal tipo di byte di tipo Byte

Dal tipo corto di tipo corto

Da Tipo Carattere per digitare Carattere

Da tipo int a tipo Numero intero

Dal tipo lungo di tipo lungo

Dal tipo galleggiante galleggiante

Dal tipo double di tipo double

Dal tipo nullo al tipo nullo

Riferimento: Conversions and Promotions Reference

1

Here's la documentazione da JLS 5.1.7

conversione Boxing converte espressioni del tipo primitivo di espressioni del tipo di riferimento corrispondente.In particolare, i seguenti nove conversioni sono chiamate le conversioni di pugilato:

Dal tipo booleano di tipo booleano

Dal tipo di byte di tipo Byte

Dal tipo corto di tipo corto

Dal tipo char a Carattere

tipo Dal tipo int al tipo intero

Dal tipo lungo da scrivere lungo

Dal tipo galleggiante galleggiante

Dal tipo double di tipo double

Dal tipo nullo al tipo nullo

Fondamentalmente la conversione direttamente da short a Integer non fa parte di il processo di autoboxing di Java.

L'autoboxing, come previsto sopra, è solo in grado di eseguire il cast implicito rappresentativo del tipo primitivo che rappresenta la classe Wrapper. Poiché questo non è il caso, causerà un errore in fase di compilazione.

0

Nel codice considerato.

class Boxing 
{ 
    public static void main(String args[]) 
    { 
     short s = 10; 
     Integer iRef = s; 
    } 
} 

Integer estende java.lang.Number. E java.lang.Short estende anche java.lang.Number. Ma Short e Integer non sono direttamente correlati se si desidera eseguire il seguente programma.

class Boxing 
{ 
    public static void main(String args[]) 
    { 
     short s = 10; 
     Number iRef = s; 
    } 
} 

Verrà eseguito senza produrre alcun errore.

Problemi correlati