Перегрузка методов с помощью аргументов-аргументов - в сочетании с упаковкой и расширением

При перегрузке методов, содержащих параметры, которые не совпадают, 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);

    }

}

Бокс: 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);

    }

}

Оба приведенных выше примера выводят «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);

    }

}

Вышеупомянутое приводит к следующей ошибке:

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

Почему не применяется то же правило, что и в предыдущих примерах? т.е. расширить байт до типа int, поскольку он является наименьшим размером больше байта?

5
задан ziggy 14 August 2011 в 12:59
поделиться