Java では、メソッド参照を使用して関数型インターフェイスのインスタンスを作成できます。ただし、特定のシナリオでは、メソッド参照の戻り値の型が Consumer インターフェイスの accept メソッドと一致しない場合に混乱が生じる可能性があります。
次のコードを検討してください。
Consumer<String> lambda1 = s -> {}; Function<String, String> lambda2 = s -> s; Consumer<String> lambda3 = LambdaTest::consume; // but s -> s doesn't work! Function<String, String> lambda4 = LambdaTest::consume;
予想されるかもしれませんが、consumer メソッドの戻り値の型 (String) が accept メソッドの期待される void 型と一致しないため、lambda3 の Consumer への割り当ては失敗するはずです。
しかし、驚くべきことに、lambda3 の割り当ては失敗します。成功する。これは、メソッドを呼び出すのと同じ方法でメソッドを関数インターフェイスに適合させることができるようにする設計上の決定によるものです。これは、戻り値を無視して、値を返すメソッドをコンシューマに割り当てることができることを意味します。
ラムダ式の場合、ルールは少し複雑になります。ラムダ式には 2 つの形式があります。
最初の形式 ((args) -> 式) は、式が値に評価される場合にのみ値互換です。 2 番目の形式 ((args) -> {statement* }) は、コード パスが値を返そうとしない場合、void と互換性があります。
式 s -> s はステートメントではないため、 s には void 互換性がありません。ただし、メソッド呼び出しなどの副作用のある式はステートメントとして使用できます。これは、 s -> のような式が意味されることを意味します。 s.toString() と s ->
したがって、LambdaTest::consume の場合、consume メソッドを呼び出すことができ、その戻り値は無視できるため、メソッド参照は Consumer インターフェイスに割り当てられます。この設計上の決定により、戻り値の型が一致しない場合でも、メソッドと関数インターフェイス間の適応性が可能になります。
以上が戻り値を持つメソッド参照を Java のコンシューマ インターフェイスに割り当てることができるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。