Java 8 コンパレーターの型推論の混乱
Java 8 では、ラムダ式を通じてコンパレーターの使用法が改善されました。ただし、複数の thenComparing 呼び出しを連鎖させると、型推論が不明確になる可能性があります。この問題は、ラムダ式にメソッド レシーバー式としての型推論が欠けているという事実に起因します。
コンパレータ チェーンと型推論
次のコードを考えてみましょう:
Comparator<String> c1 = Comparator.comparing(String::length); Comparator<String> c2 = c1.thenComparing(String::compareToIgnoreCase);
最初の行では、型パラメーターのないメソッド参照が使用されており、戻り値の型に基づいて型推論がトリガーされます。文字列::長さ。この型は、thenComparing メソッドで p1 の型を推論するために使用されます。
ただし、次のような状況では、
Collections.sort(list, c1.thenComparing(String::compareToIgnoreCase)); // Error: cannot resolve method
Collections.sort メソッドに特定の型がないため、型の推論は失敗します。 c1の情報。この問題を解決するには、明示的な型パラメータを提供します。
Collections.sort(list, c1.thenComparing(Comparator.comparing(String::compareToIgnoreCase)));
リストとコレクションの並べ替え
List.sort では、型推論が異なる方法で実行されます。
list.sort(Comparator.comparing(String::length).thenComparing(String::compareToIgnoreCase)); // No error
ここでは、Comparator が sort メソッド内で直接作成され、必要な型情報が提供されるため、型推論は必要ありません。ただし、これは最初の thenComparing 呼び出しにのみ当てはまります。明示的な型パラメータを使用しない後続の呼び出しでは、エラーが発生します。
Eclipse 固有のエラー
発生したエラーは Eclipse 固有のものである可能性があることに注意することが重要です。 JDK 8 javac コンパイラーでコードをコンパイルすると、多くの場合、これらの問題が解決されます。
以上が「thenComparing」呼び出しを連鎖するときに Java 8 コンパレーターの型推論が失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。