2017-02-23 5 views
4

Почему следующий код не компилируется.Целевой тип этого выражения должен быть функциональным интерфейсом в MethodReferences

Consumer con = (s) -> System.out::println;

Это говорит

Целевой тип этого выражения должен быть функциональный интерфейс

даже если Потребитель является функциональным интерфейсом. Ниже все работает отлично.

Consumer con2 = (s) -> {System.out.println(s);};

ответ

5

Потому что это эталонный метод, использование немного отличается:

Consumer<String> c = System.out::println; 

Аргумент, что потребитель принимает (s) будет по-прежнему передается методу println.

here - это учебник Oracle по этому вопросу.

5

Consumer con = (s) -> System.out::println;

Здесь вы пытаетесь вызвать System.out.println() с тем, что мы называем метод ссылки в Java 8. Когда вы ссылаться на метод в лямбда-выражения его должны быть, как это,

Consumer con = System.out::println;

Вы на самом деле не нужен s вызвать println метод. Справочник метода позаботится об этом. Этот оператор :: означает, что вы вызовете метод println с параметром и вы не укажете его имя.

Но когда вы это делаете,

Consumer con2 = (s) -> {System.out.println(s);};

вы говорите, лямбда-выражение явно Println содержание s которое прекрасно технически, так что не возникает какой-либо ошибки компиляции.

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