java如何允许添加Integer和Double实例?

Pal*_*agi 4 java wrapper

当我执行以下代码时,第3行内部发生了什么

Integer i=1; 
Double d1=1.1; 
Double d2= i+d1;
Run Code Online (Sandbox Code Playgroud)

And*_*ner 10

您可以在语言规范中阅读"内部"工作的定义:

但这些可能有点干.

尝试反编译以下代码:

void add(Integer i, Double d1) {
  Double d2= i+d1;
}
Run Code Online (Sandbox Code Playgroud)

这被编译为:

  void add(java.lang.Integer, java.lang.Double);
    Code:
       0: aload_1
       1: invokevirtual #6                  // Method java/lang/Integer.intValue:()I
       4: i2d
       5: aload_2
       6: invokevirtual #7                  // Method java/lang/Double.doubleValue:()D
       9: dadd
      10: invokestatic  #5                  // Method java/lang/Double.valueOf:(D)Ljava/lang/Double;
      13: astore_3
      14: return
Run Code Online (Sandbox Code Playgroud)

逐行分解(对于重要的线路,无论如何):

  • 1:这是取消装箱iIntegerint
  • 4:这是加宽int的值i,以double
  • 6:这是取消装箱d1Doubledouble
  • 9:这是添加未装箱(和加宽)的值.
  • 10:这是从拳击的结果doubleDouble.

你可以看到这相当于:

void add2(Integer i, Double d1) {
  Double d2= Double.valueOf((double) i.intValue() + d1.doubleValue());
}
Run Code Online (Sandbox Code Playgroud)

因为这两个字节码相同.