型推論の競合により逆ラムダ コンパレータが妨げられる
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 サイトの他の関連記事を参照してください。