【发布时间】:2018-11-15 18:20:04
【问题描述】:
我有一个地图条目列表
Map<String, Integer> map = new HashMap<>();
...(fill the map)...
List<Entry<String, Integer>> entries = new ArrayList<>(map.entrySet());
我想根据this answer 按值对它进行排序,但顺序相反。当我这样做时
Comparator<Entry<String, Integer>> cmp = Entry.comparingByValue();
entries.sort(cmp.reversed());
一切正常。但是当我尝试将上述两行缩短为
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();
似乎不起作用。省略类型参数Entry<String, Integer> 有效,但这会导致编译器稍后发出“未检查的方法调用”警告。
【问题讨论】:
标签: java generics comparator