我有这个片段:
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;}
}
你能告诉我这是怎么回事吗?我知道双包装类是Double,而Integer和Double都是从Number派生的,因此它们不可能互换使用
答案 0 :(得分:5)
它会进行编译,因为Integer
已取消装箱到int
,然后安全地扩展为double
。
根据Section 5.1.2 of the JLS: Widening primitive conversions:
对原始类型的19个特定转换称为扩展原语转换:
...
int
至long
,float
或double
...
尽管在某些转换中可能会出现精度损失,但扩展的原始转换从不会导致运行时异常
你不能做的事情正好相反:
class Item {
public void setNum(Double num) {...}
}
int a = 3;
i.setNum(a); // compile error
Java不会扩展和 autobox。