2015-04-02 2 views
3

Рассмотрим следующий фрагмент класса:неявное преобразование типа для лямбда-выражения

public void method() { 
    test(() -> { }); 
} 

void test(Runnable a) { 
    System.out.println("Test 1"); 
} 

void test(A a) { 
    System.out.println("Test 2"); 
} 

interface A extends Runnable { 

} 

Вызов метода method() приведет к выходу Test 2. Это означает, что лямбда-выражение () -> { } было неявно преобразовано в A. Зачем?

ответ

7

Это то же стандартное правило, применяемое ко всем перегрузкам. Java will choose the most specific applicable method.

Оба метода принимают аргумент, который имеет тип функционального интерфейса. Выражение лямбда

() -> { } 

является конвертируемым в эти типы. A является подклассом Runnable и поэтому более конкретным. Таким образом, выбирается метод с типом параметра A.

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