2

我知道有一些问题与这个问题非常相似,但请原谅我的无知,我仍然不明白:(
Java 编译器选择加宽而不是装箱是为了向后兼容。
但是为什么 Java 在必须做的时候选择 box-then-widen两次转换?

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 is not Long)。
但是如果我把代码改成这个呢?

public static void main(String[] args){

        int i = 5;

        go(i);
    }

如果 Java 编译器选择了 widen-then-box,它可以工作,但在 Java 中,您可以 box-then-widen ,而不是 widen-then-box。

我的问题是,为什么在进行一次转换时突然先选择拳击然后加宽它选择加宽而不是拳击?
一定是有原因的吧?
我想我看到了一些可能是政策不一致的地方。
但是,当然,我相信 Java 人心里有一些我还不明白的东西。

4

1 回答 1

0

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

可以在这里找到更彻底的答案:SCJP: can't widen and then box, but you can box and then widen

于 2013-07-10T08:11:16.927 回答