【问题标题】:What is the type of Map.Entry.comparingByValue().reversed()? [duplicate]Map.Entry.comparingByValue().reversed() 的类型是什么? [复制]
【发布时间】: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&lt;String, Integer&gt; 有效,但这会导致编译器稍后发出“未检查的方法调用”警告。

【问题讨论】:

标签: java generics comparator


【解决方案1】:

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

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

问题是您首先需要comparingByValue 返回的比较器的类型才能知道reversed 返回的比较器的类型。

我看不出聪明的编译器不能向后工作的任何充分理由,并且知道sort 需要特定类型,所以reversed 必须是特定类型,所以comparingByValue 必须是特定类型.但事实并非如此。

类型推断仍在研究中 (as recently as Java 10),所以也许在未来,谁知道呢。

【讨论】:

    【解决方案2】:

    当你缩短时

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

    【讨论】:

    • 糟糕,我好像把. 放错了地方。现已修复。
    猜你喜欢
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    • 2018-10-15
    • 2015-02-18
    • 2014-09-10
    • 1970-01-01
    • 1970-01-01
    • 2018-12-05
    相关资源
    最近更新 更多