Java泛型队列使用Comparator时compare方法参数不匹配如何解决
错误根因
你定义的QueueImplement是泛型类,支持任意实现了Comparable的类型P作为存储元素类型,但你在min方法中硬编码了比较器类型为Comparator<MedicalShifts>,和泛型类型P不匹配:比较器要求接收MedicalShifts类型的参数,但你的数组元素是泛型P,所以调用comp.compare时会抛出类型不匹配的错误。
另外你代码中min方法里使用的n变量未定义,运行时会报错,需要替换为你定义的成员变量cantidad。
解决方案
- 同步修改
Queue接口和QueueImplement实现类中min方法的参数类型,将Comparator<MedicalShifts>改为Comparator<P>,让比较器类型和队列存储的泛型类型保持一致。 - 将
min方法中的未定义变量n替换为成员变量cantidad。
修改后的min方法代码如下:
@Override public P min(Comparator<P> comp) { for (int i = 0; i < cantidad - 1; i++){ for (int j = 0; j < cantidad - i - 1; j++){ if (comp.compare(elements[j], elements[j+1]) > 0) { P temp = elements[j]; elements[j] = elements[j+1]; elements[j+1] = temp; } } } return elements[0]; }
如果不希望min方法修改原队列的元素顺序,可以直接调用JDK自带的排序方法实现,代码更简洁效率也更高:
@Override public P min(Comparator<P> comp) { P[] copy = Arrays.copyOf(elements, cantidad); Arrays.sort(copy, comp); return copy[0]; }
修改后泛型类型匹配,调用compare方法不会再抛出类型不匹配错误,且队列可以支持任意实现了Comparable的类型传入对应比较器调用min方法,复用性更强。
内容的提问来源于stack exchange,提问作者Luca Suc
相关产品推荐
相关产品推荐

