2014-12-29 5 views
0
public class OverloadingVarargsMethodWithNormalMethod { 

    static void a(int... c){ 
     System.out.println(c.length); 
     for(int array:c){ 
      System.out.println(array); 
     } 
    } 

    static void a(int d,int e,int f){ 
     System.out.println(d); 
     System.out.println(e); 
     System.out.println(f); 
    } 

    public static void main(String[] args) { 
     a(1,2,3); 
    } 
} 

Я ожидал двусмысленной ошибки. Но код запускает второй метод «a». Почему? Используются ли два метода для (1,2,3)?Перегрузка в методах Varargs

+3

Компилятор предпочитает метод, который имеет право явные аргументы , Он будет возвращаться к методу varargs, если нет соответствия без varags. Это позволяет вам предоставлять методы для случаев, когда требуется определенное количество аргументов. – khelwood

+1

См. [JLS 15.2.2] (http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.12.2): вызовы vararg считаются последними, на фазе 3. –

ответ

3

Будет вызываться наиболее конкретное определение функции. int a, int b, int c более конкретно, чем int... c.

По той же причине, справедливо следующее

static void foo(String a) { 

} 
static void foo(Object a) { 

} 

и первый будет называться для foo("bar");

Дальнейшее чтение здесь:

Смежные вопросы