为什么流中排序HashMap时Map.Entry::getKey和getValue报静态上下文错误
错误原因
你代码里的sort方法参数使用了无泛型的原始类型Map,没有指定键值的泛型类型。Java泛型擦除机制下,原始类型Map调用entrySet()返回的集合没有泛型信息,流中遍历到的元素会被识别为Object类型,而非Map.Entry类型。此时你使用Map.Entry::getKey方法引用时,编译器无法匹配到对应实例的非静态方法,就会抛出「非静态方法不能从静态上下文引用」的错误。
修复方案
- 给方法参数的
Map添加明确的泛型约束,匹配你方法返回值的键值类型即可。
修正后的代码如下:
public class sortByValue implements Sorting{ @Override public LinkedHashMap<String,Integer> sort(Map<String, Integer> map) { return map.entrySet().stream() .sorted(Map.Entry.comparingByValue()) .collect(Collectors.toMap( Map.Entry::getKey, Map.Entry::getValue, (oldValue, newValue) -> oldValue, LinkedHashMap::new)); } }
如果需要适配更通用的入参场景,也可以把参数泛型写成通配符形式Map<? extends String, ? extends Integer> map,兼容性更好。
内容的提问来源于stack exchange,提问作者Alpharius
相关产品推荐
相关产品推荐

