この質問にはすでに答えがあります。
マップエントリのリストがあります
Map<String, Integer> map = new HashMap<>();
...(fill the map)...
List<Entry<String, Integer>> entries = new ArrayList<>(map.entrySet());
それに従って値でソートしたいこの答えしかし逆の順序で。私がする時
Comparator<Entry<String, Integer>> cmp = Entry.comparingByValue();
entries.sort(cmp.reversed());
すべてうまくいきます。しかし、上記の2行を短くしようとすると
entries.sort(Entry.comparingByValue().reversed());
コンパイラが返す
error: incompatible types: Comparator<Entry<Object,V>> cannot be converted to Comparator<? super Entry<String,Integer>>
entries.sort(Entry.comparingByValue().reversed());
where V is a type-variable:
V extends Comparable<? super V>
Comparatorの実装はreversed()
デフォルトのメソッドは単にそれをに転送しますCollections.reverseOrder()
上記の行を次のように変更できます。
entries.sort(Collections.reverseOrder(Entry.comparingByValue()));
働く。しかし、正しいタイプは何ですかEntry.comparingByValue().reversed()
?
Comparator<Entry<String, Integer>> cmp = Entry.comparingByValue().reversed();
うまくいかないようです。 typeパラメータを省略Entry<String, Integer>
しかし、これは後でコンパイラから "未チェックのメソッド呼び出し"という警告を出します。
この場合、コンパイラは総称型パラメータを推論するほど賢くはありません。明示的に指定できます。
entries.sort(Entry.<String, Integer>comparingByValue().reversed());
問題は、まず最初に返されるコンパレータの種類が必要だということです。comparingByValue
が返すものの型を知るreversed
。
私は賢いコンパイラが逆方向に動くことができず、それを知っているのに正当な理由はないと思うsort
特定の型が必要なのでreversed
特定の型でなければならないので、comparingByValue
特定の型でなければなりません。しかし、それは物事がどのようなものではないということです。
型推論はまだ行われています(Java 10と同じくらい最近)将来的には、誰が知っているのでしょう。
短くしたとき
Comparator<Entry<String, Integer>> cmp = Entry.comparingByValue();
entries.sort(cmp.reversed());
に
entries.sort(Entry.comparingByValue().reversed());
から収集した型情報を削除します。cmp
の宣言コンパイラはまだその情報を知っている必要があるので、一般的な型付けをに追加する必要があります。Entry
:
entries.sort(Entry.<String, Integer>comparingByValue().reversed());
.
間違った場所に。今すぐ修正しました。 - MTCoster