2016-08-28 2 views
0

Какой перегруженный метод вызывается для метода ниже и почему?Передача значения null в метод смежных перегрузок

Я выполнил этот код, и он вызывает перегруженный метод со списком, но , почему это происходит?

public class AmbigiousOverload { 

    public static void add(Object o) { 
     System.out.println("Overloaded method with Object."); 
    } 

    public static void add(List l) { 
     System.out.println("Overloaded method with List."); 
    } 

    public static void main(String[] args) { 
     add(null); 
    } 

} 

Выход: Overloaded method with List.

+0

«Какой перегруженный метод будет называться« Вы знаете, какой из них. Это в вашем вопросе. –

ответ

1

Перегрузку List называют потому, что перегрузка List является наиболее специфической перегрузкой соответствия, так как все List реализаций являются подклассами Object.

От JLS Sec 15.12.2.5:

Неофициальная интуиция является то, что один метод более точен, чем другой, если любой вызов обрабатывается первым способом может быть передан на другой без ошибок компиляции.

Поскольку любой параметр, который можно передать в add(List) также могут быть переданы в add(Object), add(List) более специфичен. Таким образом, учитывая, что null может быть передан обоим, более конкретным является метод, выбранный.

Обратите внимание, что это не скомпилировалось, если у вас была перегрузка add(String), так как List и String являются «одинаково» конкретными. (Или любой другой класс: он не должен быть String).

+0

Как «Список» считается специфичным для «Объекта»? 'List' - это интерфейс, а не класс. –

+0

Все реализации 'List' -' Object '. –

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