繁体   English   中英

什么时候自动进行自动装箱?

[英]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()2ffconst_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM