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
.