LeetCode前K高频元素题中Map.Entry getValue返回Object报错问题
问题:为何Map.Entry.getValue()被提示返回Object而非Integer?
我在解决LeetCode的「前K个高频元素」问题时,尝试用PriorityQueue存储Map.Entry<Integer, Integer>类型数据,编写了如下代码:
class Solution { public int[] topKFrequent(int[] nums, int k) { HashMap<Integer, Integer> countMap = new HashMap<Integer, Integer>(); for (int num : nums) { countMap.put(num, countMap.getOrDefault(num, 0) + 1); } PriorityQueue<Map.Entry<Integer, Integer>> pq = new PriorityQueue<Map.Entry<Integer, Integer>>(k, (Map.Entry e1, Map.Entry e2) -> { Integer e1Val = e1.getValue(); Integer e2Val = e2.getValue(); return e1Val - e2Val; }); for (var entry : countMap.entrySet()) { pq.add(entry); } return null; } }
运行时出现如下错误:
Line 15: error: incompatible types: Object cannot be converted to Integer Integer e1Val = e1.getValue(); ^ Line 16: error: incompatible types: Object cannot be converted to Integer Integer e2Val = e2.getValue(); ^ 2 errors
明明Map.Entry<Integer, Integer>的getValue()应该返回Integer,为何会提示返回Object?
原因及解决方法
问题出在Lambda表达式里的Map.Entry没有指定泛型类型,你写的(Map.Entry e1, Map.Entry e2)是原始类型,而非参数化的Map.Entry<Integer, Integer>。
在Java中,原始类型会丢失泛型信息,编译器无法识别getValue()的返回类型是Integer,只会认为返回的是Object类型,自然无法直接赋值给Integer变量,从而触发类型转换错误。
解决办法
有两种简单的修正方式:
- 给Lambda里的
Map.Entry加上泛型参数:
PriorityQueue<Map.Entry<Integer, Integer>> pq = new PriorityQueue<>(k, (Map.Entry<Integer, Integer> e1, Map.Entry<Integer, Integer> e2) -> { Integer e1Val = e1.getValue(); Integer e2Val = e2.getValue(); return e1Val - e2Val; });
- 利用Java的类型推断,直接省略显式类型声明(编译器会根据PriorityQueue的泛型自动推断参数类型):
PriorityQueue<Map.Entry<Integer, Integer>> pq = new PriorityQueue<>(k, (e1, e2) -> { Integer e1Val = e1.getValue(); Integer e2Val = e2.getValue(); return e1Val - e2Val; });
另外补充:当前代码最后返回null,还未完成核心逻辑,后续需要从PriorityQueue中取出前k个元素,组装成int数组返回。
内容的提问来源于stack exchange,提问作者FlameDra
相关产品推荐
相关产品推荐

