首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在方法的重载中,加宽可以同时击败Boxing和var-args?

为什么在方法的重载中,加宽可以同时击败Boxing和var-args?
EN

Stack Overflow用户
提问于 2010-01-25 01:43:30
回答 7查看 2.7K关注 0票数 7

我正在为SCJP考试做准备,在学习加宽部分时,我发现加宽在重载方面优于Boxing和Var-args,但没有明确的解释。我试过搜索,但没有得到更好的答案。

我得到的一个答案是,编译器在选择较新的样式之前会先选择较旧的样式。但我并不信服。

编辑:我知道加宽比装箱和var-args更可取。但我的问题是为什么。我只知道其中一个。任何其他原因。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-01-25 01:50:55

是的,由于兼容性要求,编译器“选择旧的样式而不是新的样式”。想象一下,在Java5出现之前编写的一些代码,当在Java5下编译时,行为突然发生了变化!那就太糟糕了。

自Java诞生以来,不断扩大的转换就已经存在,但自动装箱和varargs是Java5的新特性。

票数 17
EN

Stack Overflow用户

发布于 2010-01-25 01:53:31

下面是它的一个例子:

代码语言:javascript
复制
class Widen {

    private static void widen(long k) {
        System.out.println("Converted to long: " + k);
    }

    private static void widen(int ... k) {
        System.out.println("Converted to varargs: " + k);
    }

    private static void widen(Integer k) {
        System.out.println("Converted to Integer: " + k);
    }

    public static void main(String ... args) {
        int value = 3;
        widen(value);  // Output: Converted to long: 3
    }
}    

因此,这意味着在自动装箱和使用varargs之前,它将会变宽。如果我们使用带有long参数的widen方法,它将在varargs之前选择自动装箱。

票数 5
EN

Stack Overflow用户

发布于 2010-01-25 02:01:10

编译器必须保持与以前版本的Java的兼容性。最重要的是,编译器选择对参数进行最高性能/最小程度的更改。升级到另一个原语比创建包装器对象更好,在内存使用和性能方面也比创建数组更好。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2128034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档