Java替换LinkedList为PriorityQueue时报ClassCastException如何解决?
异常原因
PriorityQueue是优先级队列,内部需要对存储的元素进行排序来确定优先级顺序。如果你初始化PriorityQueue时没有传入自定义比较器,它就会默认要求存入的元素实现java.lang.Comparable接口,用来对比两个元素的优先级。你的Worker类没有实现Comparable接口,所以队列尝试把Worker对象强转为Comparable类型做排序时就抛出了ClassCastException。
解决方法
有两种方案可选,按需使用即可:
方案1:让Worker类实现Comparable接口
修改Worker类定义,实现Comparable<Worker>接口,重写compareTo方法,在方法内定义优先级判断逻辑。比如可以按任务提交时间、任务权重等字段排序,示例代码如下:
public class Worker implements Comparable<Worker> { private String msg; // 你自己的其他字段、构造方法 @Override public int compareTo(Worker other) { // 此处示例按msg的字典序排序,你可以改成自己需要的优先级逻辑 // 返回负数代表当前对象优先级比other高,0代表优先级相等,正数代表other优先级更高 return this.msg.compareTo(other.msg); } }
方案2:初始化PriorityQueue时传入自定义Comparator
如果不想修改Worker类的定义,也可以在初始化队列时直接传入比较器指定排序规则。比如同样按msg字段排序的话,初始化队列的代码改成:
// Lambda表达式写法,Java 8及以上版本支持 PriorityQueue<Worker> userQueue = new PriorityQueue<>((w1, w2) -> w1.getMsg().compareTo(w2.getMsg()));
如果是低版本Java,也可以使用匿名内部类写法:
PriorityQueue<Worker> userQueue = new PriorityQueue<>(new Comparator<Worker>() { @Override public int compare(Worker w1, Worker w2) { return w1.getMsg().compareTo(w2.getMsg()); } });
注意:如果使用方案2,不需要再让Worker类实现Comparable接口,队列会优先使用你传入的Comparator做优先级判断。
内容的提问来源于stack exchange,提问作者user17081506
相关产品推荐
相关产品推荐

