我收到此错误java.lang.ClassCastException: [Ljava.lang.String; cannot be cast to java.lang.Comparable
这是有问题的代码。
final String[] methods = parseRule.getMethods();
// add to the param.
methodsToInsert.add(methods); // <-- error from here
//Where
public String[] getMethods() {
return new String[]{new String(parseMethod), new String(unParseMethod)};
}
//and param
Queue<String[]> methodsToInsert
//and at some point the methodsToInsert Object is
new PriorityQueue<String[]>();
我不完全确定为什么?任何建议
谢谢
哇,谢谢大家,我认为在以前的重构队列中是需要的,但随着它的发展,不再需要它,感谢您提供的信息以及如何使用比较器修复。由于不再需要 PriorityQueue,我将返回到 List<>。
PriorityQueue
必须以某种方式对其元素进行排序,要么在其构造函数中接受Comparator
,要么依赖于其元素被Comparable
。
来自PriorityQueue
javadocs:
优先级队列的元素根据其自然顺序进行排序,或者由队列构建时提供的比较器进行排序,具体取决于所使用的构造函数。优先级队列不允许空元素。依赖于自然排序的优先级队列也不允许插入不可比较的对象(这样做可能会导致 ClassCastException)。
您没有提供Comparator
,因此它期望所有添加的元素都是Comparable
的,但数组不是Comparable
的。
使用采用Comparator
的 PriorityQueue
构造函数提供您自己的Comparator<String[]>
。
PriorityQueue
的文档清楚地表明:
优先级队列的元素根据其自然顺序进行排序,或者由队列构建时提供的比较器进行排序,具体取决于所使用的构造函数。优先级队列不允许
null
元素。依赖于自然排序的优先级队列也不允许插入不可比较的对象(这样做可能会导致ClassCastException
)。
应将Comparator<String[]>
实例传递给将用于比较的PriorityQueue
的相应构造函数,因为无法在自然排序上比较String[]
。
PriorityQueue 包含"根据其自然顺序排序或由队列构建时提供的比较器排序"的元素。尽管 Sting 对象具有自然排序,但字符串数组没有。在创建队列对象时,您需要提供一个比较器对象,该对象可以说一个字符串数组大于或小于另一个字符串数组。
不能向PriorityQueue
添加String[]
,因为String[]
不是Comparable
。解决方案取决于您真正需要完成的任务。
对字符串进行排队
使用队列的addAll()
方法。
对字符串进行排队并保留分组
将String[]
对象排入Queue
。
对字符串进行排队并保留优先级
使用 PriorityQueue 的 addAll()
方法。
对字符串进行排队、保留分组和保留优先级
将您的String[]
包装在新类中。 应用可比较的界面。实现compareTo()
和equals()
方法。将自定义对象排入PriorityQueue
中。