ホームページ >Java >&#&チュートリアル >Java 8 の「Comparator.reversed()」がラムダ式と型推論の競合を引き起こすのはなぜですか?

Java 8 の「Comparator.reversed()」がラムダ式と型推論の競合を引き起こすのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-14 20:05:17739ブラウズ

Why Does Java 8's `Comparator.reversed()` Cause Type Inference Conflicts with Lambda Expressions?

型推論の競合により逆ラムダ コンパレータが妨げられる

Java 8 の Comparator.reversed() メソッドは広く使用されているにもかかわらず、組み合わせるとコンパイルのハードルが高くなりますラムダ式を使用すると、次のようになりますerror:

com\java8\collectionapi\CollectionTest.java:35: error: cannot find symbol
            userList.sort(Comparator.comparing(u -> u.getName()).reversed());
                                                     ^
symbol:   method getName()
location: variable u of type Object
1 error

この問題は、コンパイラの型推論メカニズムの制限に起因します。ラムダ式を Comparator.comparing() で使用する場合、パラメーターの型を推測するためにターゲットの型が必要です。最初の例では、次のターゲット型により、u は User 型であると判断されます:

Comparator.comparing() -> Function<User, User.getName()> -> User

ただし、 reversed() が導入されると、ターゲット型が中断され、コンパイラはそれを実行できなくなります。正しい型を推測します。

この問題を解決するには、追加の型を提供するメソッド参照を使用することができます。情報:

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

あるいは、ラムダで明示的なパラメータ型を指定することもできます:

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

将来のコンパイラの機能拡張でこの型推論のハードルに対処できるかどうかはまだわかりません。

以上がJava 8 の「Comparator.reversed()」がラムダ式と型推論の競合を引き起こすのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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