[英]When does autoboxing take place exactly?
考虑以下玩具方法:
public Float testReturnFloat() {
return 2f;
}
以下客户端代码:
float resultOne = testReturnFloat();
Float resultTwo = testReturnFloat();
现在两个调用都涉及自动装箱,或者只涉及后者,即使Float testReturnFloat()
已被用作方法签名?
小记:这个问题仅用于理论分析,我遇到了它,因为我几乎把它放入生产代码中由于打字错误。
testReturnFloat()
本身涉及自动装箱,因为原始float 2f
在返回之前被隐式转换为Float
。 现在你写的时候
float resultOne = testReturnFloat();
结果再次取消装箱以生成一个原始float
,然后将其赋值给resultOne
。
当你写作
Float resultTwo = testReturnFloat();
没什么特别的事。 testReturnFloat()
返回的Float
被赋值给resultTwo
。
真正理解这一点的最好方法是查看字节码。 这是testReturnFloat()
的字节码:
public java.lang.Float testReturnFloat();
Code:
0: fconst_2
1: invokestatic #57 // Method java/lang/Float.valueOf:(F)Ljava/lang/Float;
4: areturn
如您所见, Float.valueOf()
在2f
( fconst_2
)上调用。 这是我正在谈论的自动装箱。
现在为您的客户端代码:
float resultOne = testReturnFloat();
变
0: invokestatic #16 // Method testReturnFloat:()Ljava/lang/Float;
3: invokevirtual #20 // Method java/lang/Float.floatValue:()F
6: fstore_1
请注意,通过Float#floatValue()
拆箱。
最后,
Float resultTwo = testReturnFloat();
变
7: invokestatic #16 // Method testReturnFloat:()Ljava/lang/Float;
10: astore_2
正如我所说,没什么特别的; testReturnFloat()
的返回值只存储在resultTwo
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.