此表达式的目标类型必须是MethodReferences中的功能接口

时间:2017-02-23 06:07:39

标签: java-8 method-reference

为什么以下代码无法编译。

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

它说

  

此表达式的目标类型必须是功能接口

尽管Consumer是一个功能界面。以下工作正常。

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

2 个答案:

答案 0 :(得分:11)

因为这是方法参考,所以用法略有不同:

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

消费者采用的参数(s)仍将传递给println方法。

here是Oracle关于此的教程。

答案 1 :(得分:10)

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

在这里,您尝试在Java 8中使用我们称之为方法引用的方式调用System.out.println()。当您在lambda表达式中引用方法时必须是这样的,

Consumer con = System.out::println;

您实际上并不需要s来调用println方法。方法参考将负责这一点。这个::运算符意味着您将使用参数调用println方法,并且您不会指定其名称。

但是当你这样做时,

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

你告诉lambda表达式明确打印出s的内容,这在技术上是非常好的,所以它不会出现任何编译错误。