我知道有一些问题与这个问题非常相似但请原谅我的无知,我仍然没有得到它:(
为了向后兼容,Java编译器选择扩展而不是装箱
但是,为什么当Java必须进行两次转换时,它会选择盒子然后加宽?
public class OverloadingTest1 {
public static void go(Long x){
System.out.println("OverloadingTest1.go(Long x) : " + x.longValue());
}
public static void main(String[] args){
byte i = 5;
go(i);
}
}
当然,这将无法编译,因为即使Java编译器加宽然后装箱,因为它不会通过IS-A测试(Short / Integer不长)。
但是,如果我将代码更改为此怎么办?
public static void main(String[] args){
int i = 5;
go(i);
}
如果Java编译器选择了widen-then-box,它可以工作,但是在Java中,你可以盒装然后加宽,而不是加宽 - 然后盒子。
我的问题是,为什么突然选择拳击然后扩大做一次折叠转换它选择扩大拳击?
一定有理由,对吗?
我认为我看到一些可能与政策不一致的事情
但是,当然,我相信Java人员有一些我还不明白的东西。
答案 0 :(得分:0)
我认为这与设计决策有关,以确保旧代码继续适用于较新的Java版本。 Java在拳击之前已经扩大了,因此必须以不破坏预先存在的代码的逻辑的方式添加拳击机制。
可以在此处找到更详尽的答案:SCJP: can't widen and then box, but you can box and then widen