You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java 10中使用初始容量与Lambda比较器创建优先队列报错排查

问题分析与解决方案

你的问题出在Lambda表达式的参数类型声明上。Java的PriorityQueue<Integer>构造器需要的是一个Comparator<? super Integer>类型的比较器,而你显式把Lambda的参数声明为int基本类型,这就导致编译器无法找到匹配的构造器——因为泛型不支持基本类型,不存在Comparator<int>这种类型,自然也就没有对应的构造器了。

修正方案

你有两种简单的方式解决这个问题:

  1. 显式指定参数为Integer引用类型
    把Lambda里的int改成Integer,这样就和PriorityQueue的泛型类型匹配了:

    queue = new PriorityQueue<Integer>(8, (Integer v, Integer w) -> Double.compare(prior[v], prior[w]));
    
  2. 省略参数类型,让编译器自动推断
    Java 8及以上的编译器可以根据上下文自动推断Lambda参数的类型,所以直接去掉int声明即可:

    queue = new PriorityQueue<Integer>(8, (v, w) -> Double.compare(prior[v], prior[w]));
    

补充说明

当你使用int作为参数类型时,编译器会尝试将Lambda匹配到Comparator<int>,但由于Java泛型不支持基本类型,这个类型是不存在的,因此抛出了构造器未定义的错误。而当你省略参数类型或者使用Integer时,编译器会正确推断出这是一个Comparator<Integer>,正好匹配PriorityQueue的构造器要求。

内容的提问来源于stack exchange,提问作者Jeroen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:03:07