map.entry.comparingbyvalue().reversed()的类型是什么?

von4xj4u  于 2021-08-20  发布在  Java
关注(0)|答案(2)|浏览(602)

此问题已在此处找到答案

泛型类型推断不使用方法链接((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> 工作正常,但这会导致编译器稍后发出“未检查的方法调用”警告。

9lowa7mx

9lowa7mx1#

在这种情况下,编译器不够聪明,无法推断泛型类型参数。您可以显式指定它们:

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

问题是,您首先需要 comparingByValue 要知道 reversed .
我看不出有什么好的理由可以解释为什么一个聪明的编译器不能反向工作并且知道这一点 sort 需要特定类型,因此 reversed 必须是特定类型,所以 comparingByValue 必须是特定类型。但事实并非如此。
类型推断仍在进行中(最近是Java10),所以可能在将来,谁知道呢。

ua4mk5z4

ua4mk5z42#

当你缩短

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());

相关问题