ホームページ > Java > &#&チュートリアル > 「thenComparing」呼び出しを連鎖するときに Java 8 コンパレーターの型推論が失敗するのはなぜですか?

「thenComparing」呼び出しを連鎖するときに Java 8 コンパレーターの型推論が失敗するのはなぜですか?

Susan Sarandon
リリース: 2024-11-28 12:53:11
オリジナル
416 人が閲覧しました

Why Does Java 8 Comparator Type Inference Fail When Chaining `thenComparing` Calls?

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート