此表达式的目标类型必须是 MethodReferences 中的功能接口
The target type of this expression must be a functional interface in MethodReferences
为什么下面的代码编译不通过。
Consumer con = (s) -> System.out::println;
它说
The target type of this expression must be a functional interface
尽管 Consumer 是一个函数式接口。下面的工作正常。
Consumer con2 = (s) -> {System.out.println(s);};
因为那是一个方法参考,所以用法有点不同:
Consumer<String> c = System.out::println;
消费者接受的参数 (s
) 仍将传递给 println
方法。
here 是 Oracle 的教程。
Consumer con = (s) -> System.out::println;
在这里,您尝试使用我们在 Java 中称为 方法引用 的方法调用 System.out.println()
8. 当您要引用一个lambda 表达式中的方法必须是这样的,
Consumer con = System.out::println;
您实际上不需要 s
来调用 println
方法。方法参考将解决这个问题。此 ::
运算符意味着您将使用参数调用 println
方法,并且您不会指定其名称。
但是当你这样做时,
Consumer con2 = (s) -> {System.out.println(s);};
您是在告诉 lambda 表达式显式打印 s
的内容,这在技术上完全没问题,因此不会出现任何编译错误。
为什么下面的代码编译不通过。
Consumer con = (s) -> System.out::println;
它说
The target type of this expression must be a functional interface
尽管 Consumer 是一个函数式接口。下面的工作正常。
Consumer con2 = (s) -> {System.out.println(s);};
因为那是一个方法参考,所以用法有点不同:
Consumer<String> c = System.out::println;
消费者接受的参数 (s
) 仍将传递给 println
方法。
here 是 Oracle 的教程。
Consumer con = (s) -> System.out::println;
在这里,您尝试使用我们在 Java 中称为 方法引用 的方法调用 System.out.println()
8. 当您要引用一个lambda 表达式中的方法必须是这样的,
Consumer con = System.out::println;
您实际上不需要 s
来调用 println
方法。方法参考将解决这个问题。此 ::
运算符意味着您将使用参数调用 println
方法,并且您不会指定其名称。
但是当你这样做时,
Consumer con2 = (s) -> {System.out.println(s);};
您是在告诉 lambda 表达式显式打印 s
的内容,这在技术上完全没问题,因此不会出现任何编译错误。