怎么可能提供整数预期双倍的整数?

Med*_*das 0 java

我有这个片段:

class scratch_5{
  public static void main(String theory[]){
    Item i = new Item();
    Integer a = 3;
    i.setNum(a);
    System.out.println(i.getNum());
  }

}

class Item{
   double num;

   public void setNum(double num){this.num=num;}
   public double getNum(){return num;}
}
Run Code Online (Sandbox Code Playgroud)

你能解释一下这有什么可能吗?我知道双包装类是Double,并且Integer和Double都是从Number派生的,因此它们不可能互换使用

Boh*_*ian 5

它编译因为Integer未装箱到一个int,然后安全地扩大到double.

根据JLS第5.1.2节:拓宽原始转换:

对原始类型19个特定的转换被称为宽元转换:
...
intlong,float或者double
......
尽管可能出现的精度损失[在一些转换],一个宽元转换从来没有导致运行时异常


不能做的是相反的:

class Item {
    public void setNum(Double num) {...}
}

int a = 3;
i.setNum(a);   // compile error
Run Code Online (Sandbox Code Playgroud)

Java不会扩大和自动装箱.