为什么在方法的重载中加宽Boxing和var-args?

Gur*_*lki 8 java

我正在准备进行SCJP考试,在学习拓宽部分的时候,考虑到加宽超过Boxing和Var-args,但是没有明确的解释.尝试搜索但没有得到任何更好的答案.

我得到的一个答案是因为编译器在选择较新的样式之前选择较旧的样式.但我不相信.

编辑:我知道扩大比拳击和var-args更喜欢.但为什么是我的问题.其中我知道一个.任何其他原因.

Chr*_*ung 17

是的,由于兼容性要求,编译器"选择旧样式而不是新样式".想象一下在Java 5出现之前编写的一些代码,在Java 5下编译时突然发生了行为变化!那会很糟糕.

自Java诞生以来,转换范围不断扩大,但autoboxing和varargs是Java 5的新功能.


man*_*unk 5

这是一个例子:

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
    }
}    
Run Code Online (Sandbox Code Playgroud)

所有这一切都意味着它会在自动装箱和使用varargs之前扩大.如果我们用long参数取出widen的方法,它会在varargs之前选择自动装箱.