我有这个片段:
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派生的,因此它们不可能互换使用
它编译因为Integer未装箱到一个int,然后安全地扩大到double.
对原始类型19个特定的转换被称为宽元转换:
...
int到long,float或者double
......
尽管可能出现的精度损失[在一些转换],一个宽元转换从来没有导致运行时异常
你不能做的是相反的:
class Item {
public void setNum(Double num) {...}
}
int a = 3;
i.setNum(a); // compile error
Run Code Online (Sandbox Code Playgroud)
Java不会扩大和自动装箱.