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

Почему следующий код не компилируется.

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

Это говорит

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

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

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


person HariJustForFun    schedule 23.02.2017    source источник


Ответы (2)


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

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

Аргумент, который принимает потребитель (s), все равно будет передан методу println.

здесь находится руководство Oracle по этому вопросу.

person Eugene    schedule 23.02.2017

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);};

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

person fluffyBatman    schedule 23.02.2017