[解決済み] Comparator.reversed()がラムダを使用してコンパイルされない
質問
Userオブジェクトを含むリストがあり、そのリストをソートしようとしていますが、メソッド参照を使用してのみ動作し、ラムダ式ではコンパイラがエラーを出します。
List<User> userList = Arrays.asList(u1, u2, u3);
userList.sort(Comparator.comparing(u -> u.getName())); // works
userList.sort(Comparator.comparing(User::getName).reversed()); // works
userList.sort(Comparator.comparing(u -> u.getName()).reversed()); // Compiler 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
どのように解決するのですか?
これは、コンパイラの型推論機構の弱点です。の型を推論するために
u
をラムダ内で推論するために
ターゲット型
を設定する必要があります。これは以下のように実現される。
userList.sort()
が期待する引数は
Comparator<User>
. 最初の行では
Comparator.comparing()
を返す必要があります。
Comparator<User>
. このことは
Comparator.comparing()
が必要であることを意味します。
Function
を取るもので
User
の引数を取る。したがって、1行目のラムダでは
u
は必ず
User
であり、すべてが動作します。
2行目と3行目では、ターゲットのタイピングは
reversed()
. のレシーバとリターンタイプの両方が存在するためです。
reversed()
は
Comparator<T>
であるため、ターゲットの型がレシーバーに伝搬されるように思えるのですが、そうではありません。(言ったように、それは弱点です)。
2 行目では、メソッド参照が追加の型情報を提供し、このギャップを埋めています。この情報は 3 行目には存在しないため、コンパイラは
u
は
Object
(最後の手段である推論フォールバック)であり、これは失敗します。
明らかに、メソッド参照を使用できる場合は、そうすればうまくいきます。メソッド参照を使用できない場合もあります。たとえば、追加のパラメータを渡したい場合、ラムダ式を使用する必要があります。その場合は、ラムダ式で明示的にパラメータの型を指定します。
userList.sort(Comparator.comparing((User u) -> u.getName()).reversed());
将来のリリースでは、このケースをカバーするためにコンパイラを拡張することが可能かもしれません。
関連
-
Javaジェネリックを1つの記事で
-
[解決済み] Mavenを使用して、依存関係を持つ実行可能なJARを作成するにはどうすればよいですか?
-
[解決済み] Javaはパラメータのデフォルト値をサポートしていますか?
-
[解決済み] ランダムな文字列を使用するこのコードは、なぜ "hello world" と表示されるのですか?
-
[解決済み] Could not find or load main class "とはどういう意味ですか?
-
[解決済み] リスト内包とラムダ+フィルタの比較
-
[解決済み] Distinct() with lambda?
-
[解決済み】Javaではfinallyブロックは必ず実行されるのですか?
-
[解決済み】C++11のラムダ式って何?
-
[解決済み】Java 8 Lambda関数が例外を投げる?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
スレッド "main "での例外 java.util.NoSuchElementException in Java 問題解決済み
-
undefined[sonar] sonar:デフォルトのスキャンルール
-
Jsoup-Crawlingの動作
-
java マイクロソフト払い戻し予期せぬサーバーからのファイルの終了
-
-bash: java: コマンドが見つからない 解決方法
-
セミコロン期待値エラー解決
-
FindBugの使用概要
-
アノテーション「@Retention」の役割
-
Server Tomcat v9.0 Server at localhost の起動に失敗しました。
-
eclipse 実行 Java、エラー: 選択を起動できず、レシーバーもありません。