Java为什么不加宽 - 那么 - 盒子?

时间:2013-07-10 08:07:45

标签: java casting

我知道有一些问题与这个问题非常相似但请原谅我的无知,我仍然没有得到它:(
为了向后兼容,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人员有一些我还不明白的东西。

1 个答案:

答案 0 :(得分:0)

我认为这与设计决策有关,以确保旧代码继续适用于较新的Java版本。 Java在拳击之前已经扩大了,因此必须以不破坏预先存在的代码的逻辑的方式添加拳击机制。

可以在此处找到更详尽的答案:SCJP: can't widen and then box, but you can box and then widen