コンパイラの落とし穴: Comparator.reversed() とラムダ式
ラムダ式は並べ替え動作をカスタマイズする簡潔な方法を提供しますが、 Comparator.reversed() を実行するとコンパイルエラーが発生します。このエラーは、コンパイラがラムダの正しいターゲット型を推論できないことが原因で発生します。
エラーについて
次のサンプル コードを検討してください:
userList.sort(Comparator.comparing(u -> u.getName()).reversed()); // Compiler error
この場合、コンパイラがラムダ内のパラメータ u の型を判断できないためにエラーが発生します。 表現。型を推論するには、コンパイラにはラムダのターゲット型が必要です。
通常、ターゲット型はラムダが使用されるコンテキストによって確立されます。指定したコード スニペットの最初の行では、 userList.sort() がその型の引数を期待しているため、ターゲットの型は Comparator
ラムダとメソッドのリファレンス
エラーは、ラムダ式を使用する場合にのみ発生します。メソッド参照を使用する場合 (コード スニペットの 2 行目など)、ターゲットの型はメソッド シグネチャによって明示的に提供され、型推論の問題が解決されます。
エラーの解決
ラムダ式を使用する際のエラーを解決するには、パラメータを明示的に指定します。 type:
userList.sort(Comparator.comparing((User u) -> u.getName()).reversed());
これにより、u が User 型であることが明示的に指定され、コンパイラがターゲットの型を正しく推論できるようになります。
コンパイラの弱点
問題のエラーは、コンパイラの型推論メカニズムの弱点を浮き彫りにしています。 reversed() メソッドがターゲットの入力を妨げる正確な理由は不明です。将来のコンパイラの機能拡張では、この問題が解決され、明示的なパラメータの入力なしでラムダ式を使用できるようになる可能性があります。
以上がJava ラムダ式で「Comparator.reversed()」がコンパイル エラーを引き起こすのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。