【问题标题】:Java why not widen - then - box?Java 为什么不扩大 - 那么 - 盒子?
【发布时间】:2013-07-08 01:50:13
【问题描述】:

我知道有一些问题与这个问题非常相似,但请原谅我的无知,我仍然不明白:(
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 人心里有一些我还不明白的东西。

【问题讨论】:

    标签: java casting


    【解决方案1】:

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

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

    【讨论】:

    • 我知道,为了向后兼容,Java 编译器倾向于扩大而不是装箱。在我的帖子里。我的问题是,当它必须进行两次转换时,为什么它要 box-then-widen ?
    猜你喜欢
    • 2018-11-11
    • 2023-03-16
    • 1970-01-01
    • 2011-02-08
    • 2023-03-11
    • 2014-07-27
    • 1970-01-01
    • 2019-01-18
    • 1970-01-01
    相关资源
    最近更新 更多