ホームページ >Java >&#&チュートリアル >Lambdas で `Comparator.comparing().reversed()` がコンパイラ エラーを引き起こすのはなぜですか?

Lambdas で `Comparator.comparing().reversed()` がコンパイラ エラーを引き起こすのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-20 17:22:10310ブラウズ

Why Does `Comparator.comparing().reversed()` Cause a Compiler Error with Lambdas?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。