0

この質問にはすでに答えがあります。

マップエントリのリストがあります

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>しかし、これは後でコンパイラから "未チェックのメソッド呼び出し"という警告を出します。


  • この質問に対する回答を確認するstackoverflow.com/questions/24794924/… - ernest_k
  • @ernest_kさて、あなたはそうです。 「競争上の優位性」のためにこれをクローズしたと考える人がいる場合に備えて、私は自分の答えをコミュニティウィキとしてマークしました。 - Michael
  • ありがとう@Michael - ernest_k

2 답변


3

この場合、コンパイラは総称型パラメータを推論するほど賢くはありません。明示的に指定できます。

entries.sort(Entry.<String, Integer>comparingByValue().reversed());

問題は、まず最初に返されるコンパレータの種類が必要だということです。comparingByValueが返すものの型を知るreversed

私は賢いコンパイラが逆方向に動くことができず、それを知っているのに正当な理由はないと思うsort特定の型が必要なのでreversed特定の型でなければならないので、comparingByValue特定の型でなければなりません。しかし、それは物事がどのようなものではないということです。

型推論はまだ行われています(Java 10と同じくらい最近)将来的には、誰が知っているのでしょう。


1

短くしたとき

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

リンクされた質問


関連する質問

最近の質問