使用var-args重载方法 - 结合装箱和加宽

zig*_*ggy 5 java overloading scjp

当重载包含不匹配参数的方法时,JVM将始终使用比参数宽的最小参数的方法.

我用以下两个例子证实了上述内容:

扩展:字节扩展为int

class ScjpTest{

    static void go(int x){System.out.println("In Int");}
    static void go(long x){System.out.println("In long");}

    public static void main (String[] args){

        byte b = 5;

        go(b);

    }
Run Code Online (Sandbox Code Playgroud)

}

拳击:int盒装到整数

class ScjpTest{

    static void go(Integer x){System.out.println("In Int");}
    static void go(Long x){System.out.println("In Long");}

    public static void main (String[] args){

        int b = 5;

        go(b);

    }

}
Run Code Online (Sandbox Code Playgroud)

以上两个示例都输出"In Int",这是正确的.我很困惑,虽然情况涉及var-args,如下例所示

class ScjpTest{

    static void go(int... x){System.out.println("In Int");}
    static void go(long... x){System.out.println("In lInt");}

    public static void main (String[] args){

        byte b = 5;   //or even with:  int b = 5

        go(b);

    }

}
Run Code Online (Sandbox Code Playgroud)

以上产生以下错误:

ScjpTest.java:14: reference to go is ambiguous, both method go(int...) in ScjpTest and method go(long...) in ScjpTest match
                go(b);
                ^
1 error
Run Code Online (Sandbox Code Playgroud)

为什么它不应用与前面示例中相同的规则?即将字节扩展为int,因为它是大于字节的最小字节?

Ale*_*exR 5

var-args语法只是将数组作为参数传递的别名:

foo(int ... arg) 等于 foo(int[] arg)

但阵列不是分层的.String[]不是的子类Object[].完全相同的规则与方法参数相关.因此,编译器无法区分接受的2个重载方法long[]int[]传递时间byte.