web-dev-qa-db-ja.com

この式のターゲットタイプは、MethodReferencesの機能インターフェイスである必要があります

次のコードがコンパイルされないのはなぜですか。

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

それは言います

この式のターゲットタイプは、機能的なインターフェイスである必要があります

consumerは機能的なインターフェイスですが。以下は問題なく動作します。

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

13
HariJustForFun

これはメソッド参照であるため、使用方法は少し異なります。

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

コンシューマが取る引数(s)は、引き続きprintlnメソッドに渡されます。

here は、これに関するOracleのチュートリアルです。

11
Eugene

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

ここで、あなたはSystem.out.println()を呼び出すことを試みていますメソッド参照 in Java 8.メソッドを参照するときラムダ式では、このようなものでなければなりません、

_Consumer con = System.out::println;_

sメソッドを呼び出すためにprintlnは実際には必要ありません。メソッド参照がそれを処理します。この_::_演算子は、パラメーターを指定してprintlnメソッドを呼び出し、その名前を指定しないことを意味します。

しかし、これを行うと、

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

sの内容を明示的にprintlnするようにラムダ式に指示していますが、これは技術的には完璧であるため、コンパイルエラーは発生しません。

10
fluffyBatman