2017-02-23 12 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;

、あなたは

、あなたはその、このようでなければなりませんラムダ式のメソッドを参照するようにしているとき、私たちは、Java 8の メソッド参照呼んで System.out.println()を起動しようとしています

Consumer con = System.out::println;

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

しかし、あなたはこの、

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

を行うときには、それがどのコンパイルエラーが発生しないように明示的に技術的にまったく問題ありsの内容をprintlnをするラムダ式を言っています。

関連する問題