2014-05-21 15 views
5

Si consideri il seguente metodo giocattolo:Quando si verifica automaticamente il boxing automatico?

public Float testReturnFloat() { 
    return 2f; 
} 

E il seguente codice client:

float resultOne = testReturnFloat(); 
Float resultTwo = testReturnFloat(); 

fare ora entrambe le chiamate coinvolgono autoboxing, o solo quest'ultima, anche se Float testReturnFloat() è stato usato come metodo di firma?

Piccola nota: questa domanda è solo per l'analisi teorica, l'ho incontrata poiché ho quasi inserito questo codice di produzione a causa di un errore di battitura.

risposta

9

testReturnFloat() si comporta autoboxing perché il galleggiante primitiva 2f viene implicitamente convertito in un Float prima che sia restituito. Ora, quando si scrive

float resultOne = testReturnFloat(); 

il risultato è di nuovo unboxing per produrre un primitivo float che viene poi assegnato a resultOne.

Quando si scrive

Float resultTwo = testReturnFloat(); 

non succede nulla di speciale. Il Float restituito da testReturnFloat() viene assegnato a resultTwo.


Davvero il modo migliore per capire questo è guardare il bytecode. Ecco il bytecode per testReturnFloat():

public java.lang.Float testReturnFloat(); 
    Code: 
     0: fconst_2  
     1: invokestatic #57     // Method java/lang/Float.valueOf:(F)Ljava/lang/Float; 
     4: areturn  

Come si può vedere, Float.valueOf() viene invocato su 2f (fconst_2). Questo è l'autoboxing di cui stavo parlando.

Ora per il vostro codice client:

float resultOne = testReturnFloat(); 

diventa

0: invokestatic #16     // Method testReturnFloat:()Ljava/lang/Float; 
    3: invokevirtual #20     // Method java/lang/Float.floatValue:()F 
    6: fstore_1 

noti che unboxing avviene tramite Float#floatValue().

Infine,

Float resultTwo = testReturnFloat(); 

diventa

7: invokestatic #16     // Method testReturnFloat:()Ljava/lang/Float; 
    10: astore_2 

Come ho detto, niente di speciale; il valore di ritorno di testReturnFloat() è appena memorizzato in resultTwo.

Problemi correlati