次のコードはコンパイルされないのはなぜですか?この式のターゲットタイプは、MethodReferencesの機能インタフェースでなければなりません
Consumer con = (s) -> System.out::println;
これは、この式のターゲット・タイプは、消費者が機能インタフェースであっても、機能インタフェース
でなければなりません
言います。以下はうまく動作します。
Consumer con2 = (s) -> {System.out.println(s);};
次のコードはコンパイルされないのはなぜですか?この式のターゲットタイプは、MethodReferencesの機能インタフェースでなければなりません
Consumer con = (s) -> System.out::println;
これは、この式のターゲット・タイプは、消費者が機能インタフェースであっても、機能インタフェース
でなければなりません
言います。以下はうまく動作します。
Consumer con2 = (s) -> {System.out.println(s);};
そのメソッド参照なので、使用は少し異なっている:
Consumer<String> c = System.out::println;
消費者が取る引数(s
)は依然としてprintln
メソッドに渡されます。
hereはこれに関するOracleのチュートリアルです。ここで
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をするラムダ式を言っています。