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

Java の一部のラムダ式で「Comparator.reversed()」がコンパイル エラーを引き起こすのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-03 14:51:14407ブラウズ

Why Does `Comparator.reversed()` Cause Compilation Errors with Some Lambda Expressions in Java?

Comparator.reversed() ラムダ式との非互換性

ラムダ式と Comparator の reversed() メソッドを使用してリストを並べ替えようとした場合とコンパイルエラーが発生します。この動作を理解するには、コンパイラーの型推論メカニズムの複雑さを詳しく調べることが重要です。

Java コンパイラーは、ラムダ式内の変数の型を、変数が使用されるコンテキストに基づいて決定します。この場合、sort メソッドは Comparator 型の引数を期待します。メソッド参照を使用する場合、受信側の型はすでにわかっており、それに応じてラムダ引数が推論されます。例:

userList.sort(Comparator.comparing(User::getName).reversed()); // works

ただし、ラムダ式を直接使用すると、コンパイラはラムダ内の変数の型を推測するのに苦労します。ラムダのターゲット タイプは Comparator で、これには引数として User を取る Function が必要です。次のコードでは、ラムダは u を User として正しく推論します:

userList.sort(Comparator.comparing(u -> u.getName()).reversed()); // works

ただし、メソッド参照がない場合、コンパイラはデフォルトで u の型を Object として推論するため、コンパイル エラーが発生します。

userList.sort(Comparator.comparing(u -> u.getName()).reversed()); // Compiler error

この問題を解決するには、可能であればメソッド参照を使用するか、ラムダ内でパラメータの型を明示的に指定します。式:

userList.sort(Comparator.comparing((User u) -> u.getName()).reversed()); // works

この制限はイライラするかもしれませんが、これはコンパイラの型推論メカニズムの結果です。将来のコンパイラの機能強化により、この問題が解決される可能性があります。

以上がJava の一部のラムダ式で「Comparator.reversed()」がコンパイル エラーを引き起こすのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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