Java 10中使用初始容量与Lambda比较器创建优先队列报错排查
问题分析与解决方案
你的问题出在Lambda表达式的参数类型声明上。Java的PriorityQueue<Integer>构造器需要的是一个Comparator<? super Integer>类型的比较器,而你显式把Lambda的参数声明为int基本类型,这就导致编译器无法找到匹配的构造器——因为泛型不支持基本类型,不存在Comparator<int>这种类型,自然也就没有对应的构造器了。
修正方案
你有两种简单的方式解决这个问题:
显式指定参数为
Integer引用类型
把Lambda里的int改成Integer,这样就和PriorityQueue的泛型类型匹配了:queue = new PriorityQueue<Integer>(8, (Integer v, Integer w) -> Double.compare(prior[v], prior[w]));省略参数类型,让编译器自动推断
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
相关产品推荐
相关产品推荐

