2013-10-15 2 views
1

Предположим, у меня есть следующие два объявления методаКак компилятор распознает, какой перегруженный метод использовать?

public void foo() {/* do something */ } 
public void foo(String...args) {/* do something else */} 

Затем, когда я призываю foo(), как это Java знает, что я имел в виду, чтобы назвать первым? Насколько я понимаю, я мог бы означать второе. Потому что следующее работает просто отлично.

public void bar(String...args) {} 
public void callBar() 
{ 
    // call bar() with no arguments. 
    bar(); 
} 
+0

Ответ rgettman на [this] (http://stackoverflow.com/questions/19366332/variable-argument-constructor-may-conflict-but-compiles/19366472#comment28697215_19366472) только что вчера объясняет вещи очень хорошо. – ajb

ответ

4

Согласно JLS, конструктор с переменными аргументами имеет самый низкий приоритет. Если вызов может быть определен без использования метода varargs, он будет использоваться для этого.

Вторая фаза (§15.12.2.3) выполняет разрешение перегрузки при разрешении бокса и распаковки, но все же исключает использование вызова метода переменной arity. Если на этом этапе не обнаружен какой-либо применимый метод, обработка продолжается до третьей фазы.

Это гарантирует, что метод никогда не выбирается посредством вызова метода переменной arity, если он применим посредством вызова метода фиксированной arity.

Третий этап (§15.12.2.4) позволяет комбинировать перегрузку с методами переменной arity, боксом и распаковкой.

Где «переменная арность» относится к параметру varargs. Больше информации можно найти here.

+0

А, так это просто соглашение/правило? –

+0

Да, именно так определяется JLS. –

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