2013-01-20 8 views
10

solo cercando di capire di auto-boxing, che faccio parte una cosa:classi wrapper - perché letterali interi non riescono a lungo, ma lavorano per qualcosa di più piccolo

Short s = 250; 
Long l = 250; 

L'assegnazione di Long l fallisce. Questo, mi aspetto, è perché non è possibile allargare la casella (ad esempio, si tenta di ampliare il valore int250 a long e quindi inserirlo nel riquadro che non può eseguire).

Tuttavia, l'assegnazione a Short s funziona. Che cosa sta succedendo per rendere questo bene? La mia ipotesi era che stia ancora facendo boxe e qualche tipo di conversione. Ma se si tratta di sapere 250 in uno short, perché non sa che 250 si adatta a un long?

+1

Auto-boxing è il male [Solo un parere]. Nei miei progetti privati ​​e in azienda a cui lavoro, consideriamo gli auto-boxing come errori per evitare confusioni. – MrSmith42

+1

come funziona 'fail for Long'? – Archer

+0

Per curiosità, cosa succede allo Short quando il tuo letterale è 250L? (So ​​che specifica un letterale lungo, ma non sono sicuro se c'è un letterale esplicito corrispondente corrispondente) – Charlie

risposta

11

Normalmente, non è possibile applicare conversioni multiple (impliciti) in assegnazione (JLS §5.2 Assignment Conversion):

conversione assegnazione avviene quando viene assegnato il valore di un'espressione (§15.26) a una variabile: il tipo dell'espressione deve essere convertito nel tipo della variabile. contesti assegnazione permettono l'uso di uno dei seguenti:

  • una conversione identità (§5.1.1)
  • un allargamento conversione primitiva (§5.1.2)
  • una conversione riferimento allargamento (§ 5.1.5)
  • una conversione di boxe (§5.1.7) facoltativamente seguita da una conversione riferimento allargamento
  • una conversione unboxing (§5.1.8) facoltativamente seguita da una conversione primitiva ampliamento.

Long l=250; richiede due conversioni (ampliamento conversione primitiva seguita da conversione boxe), ecco perché non viene compilato.

Long l=250l; compila perché richiede una singola conversione di boxe.

Ma ambito conversione di un'espressione costante è un caso speciale, ecco perché Short s=250; compila:

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 di variabile è byte, short o char e il valore dell'espressione costante è rappresentabile nel tipo di variabile.
  • Un ambito conversione primitiva seguita da una conversione boxe può essere utilizzato se il tipo di variabile è:
    • byte e il valore dell'espressione costante è rappresentabile nel tipo byte.
    • Breve e il valore dell'espressione costante è rappresentabile nel tipo breve.
    • Il carattere e il valore dell'espressione costante sono rappresentabili nel tipo char.
+0

Grazie per lo sforzo che devi aver preso nel creare questa risposta, è apprezzato. Quindi è un "caso speciale"? Speravo che esistesse una ragione tangibile che non capivo e che quindi potevo apprendere piuttosto che qualcosa che dovrei ricordare esplicitamente come un'eccezione alla regola tipo di cosa. –

+0

@ user1186046: Non riesco a immaginare un motivo tangibile per questo caso specifico, ma forse posso renderlo più chiaro come segue: l'intero concetto di restringimento della conversione di espressioni costanti è un caso speciale (perché è l'unico tipo di conversione restrittiva che può avvengono implicitamente), quindi non sorprende che produca casi speciali se applicati a parti specifiche della lingua. – axtavt

+0

Ciao, la ragione del caso è che sto facendo OCJP e il punto dell'esame non è quello di testare la tua conoscenza di java, ma di testare le cose irrilevanti che non hai bisogno di sapere per poter acquistare i libri degli esaminatori ;) –

0

Idealmente, nessun restringimento auto dovrebbe essere consentito.

Ma dal momento che non ci sono byte/letterali brevi, non possiamo scrivere

byte b = 0b; 

e sembra sciocco

byte b = (byte)0; 

in modo automatico restringimento della costante intera è consentito in modo che possiamo scrivere

byte b = 0; 

che viene trasferito al caso di autoboxing.

Per lungo/lungo, poiché ci sono letterali lunghi, questo è meno di un problema. Tuttavia, dovrebbe essere consentito, poiché l'auto allargamento del numero intero con segno è sempre sicuro.

Problemi correlati