此问题已在此处找到答案:
泛型类型推断不使用方法链接((2个答案)
两年前关闭。
我有一个Map条目列表
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());
一切正常。但是当我试着把上面两行缩短到
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>
这似乎很奇怪,因为比较器的 reversed()
默认方法只是将其传输到 Collections.reverseOrder()
我可以把上面这行改成
entries.sort(Collections.reverseOrder(Entry.comparingByValue()));
工作。但是什么是正确的类型 Entry.comparingByValue().reversed()
?
Comparator<Entry<String, Integer>> cmp = Entry.comparingByValue().reversed();
似乎不起作用。省略类型参数 Entry<String, Integer>
工作正常,但这会导致编译器稍后发出“未检查的方法调用”警告。
2条答案
按热度按时间9lowa7mx1#
在这种情况下,编译器不够聪明,无法推断泛型类型参数。您可以显式指定它们:
问题是,您首先需要
comparingByValue
要知道reversed
.我看不出有什么好的理由可以解释为什么一个聪明的编译器不能反向工作并且知道这一点
sort
需要特定类型,因此reversed
必须是特定类型,所以comparingByValue
必须是特定类型。但事实并非如此。类型推断仍在进行中(最近是Java10),所以可能在将来,谁知道呢。
ua4mk5z42#
当你缩短
到
删除从中收集的类型信息
cmp
奥巴马的声明。编译器仍然需要知道这些信息,因此需要将泛型类型添加到Entry
: