ホームページ >Java >&#&チュートリアル >Lambdas で `Comparator.comparing().reversed()` がコンパイラ エラーを引き起こすのはなぜですか?
Lambda を使用した Comparator.reversed() のコンパイラ エラーを理解する
ラムダ式を使用して User オブジェクトのリストを並べ替えようとしたときコンパレータ (例:
List<User> userList = Arrays.asList(u1, u2, u3); userList.sort(Comparator.comparing(u -> u.getName()).reversed());
コンパイラ)ラムダの u 変数に getName() メソッドが見つからないことを示すエラーが表示される場合があります。この問題は、コンパイラの型推論メカニズムの弱点に起因します。
このエラーを解決するには、ラムダのターゲット型を確立する必要があります。 Comparator.comparing() を使用して並べ替える場合、ラムダはリスト内のオブジェクトと同じ型の引数を取る必要があります。
メソッド参照を使用するコードの最初の行では、ターゲットの型メソッド パラメーターのタイプ (User) から推測されます。これにより、コンパイラーはラムダ内の u の型を正しく推論できるようになります。
ただし、メソッド参照の代わりにラムダ式を使用する 3 行目では、reversed() の呼び出しによってターゲットの型が中断されます。推論。コンパイラはターゲットの型を受信側に伝播できず、getName() メソッドを持たない推論された Object 型が残ります。
この問題を解決するには、メソッド参照を使用するか、または
userList.sort(Comparator.comparing((User u) -> u.getName()).reversed());
のように、ラムダで u の型を明示的に指定します。これにより、コンパイラがラムダ内で u の正しい型を推論できるようになります。指定されたコンパレータに従ってリストを正常に並べ替えます。
以上がLambdas で `Comparator.comparing().reversed()` がコンパイラ エラーを引き起こすのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。