我收到此错误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[]>();
我不完全确定为什么?任何建议
答案 0 :(得分:4)
PriorityQueue
必须以某种方式对其元素进行排序,要么在其构造函数中接受Comparator
,要么依赖其元素为Comparable
。
优先级队列的元素按照其自然顺序排序,或者由队列构造时提供的比较器排序,具体取决于使用的构造函数。优先级队列不允许null元素。依赖于自然排序的优先级队列也不允许插入不可比较的对象(这样做可能会导致ClassCastException)。
您尚未提供Comparator
,因此预计所有添加的元素都为Comparable
,但数组不是Comparable
。
使用the PriorityQueue
constructor that takes a Comparator
提供您自己的Comparator<String[]>
。
答案 1 :(得分:2)
PriorityQueue
的文档明确指出:
优先级队列的元素按照其自然顺序排序,或者由队列构造时提供的比较器排序,具体取决于使用的构造函数。优先级队列不允许
null
个元素。依赖于自然排序的优先级队列也不允许插入不可比较的对象(这样做可能会导致ClassCastException
)。
您应该将Comparator<String[]>
个实例传递给将用于比较的PriorityQueue
个appropriate constructor,因为String[]
无法按自然顺序进行比较。
答案 2 :(得分:1)
PriorityQueue包含“根据其自然顺序排序,或由队列构建时提供的比较器排序”的元素。尽管Sting对象具有自然顺序,但字符串数组却没有。您需要在创建队列对象时提供Comparator对象,这可以说一个String数组大于或小于另一个String数组。
答案 3 :(得分:1)
您无法将String[]
添加到PriorityQueue
,因为String[]
不是Comparable
。解决方案取决于您真正需要完成的任务。
对字符串进行排队
使用队列的addAll()
方法。
对字符串进行排队并保留分组
将您的String[]
个对象排入Queue
。
对字符串进行排队并保留优先级
使用PriorityQueue的addAll()
方法。
对字符串进行排队,保留分组并保留优先级
将您的String[]
包裹在新课程中。应用Comparable接口。实施compareTo()
和equals()
方法。将您的自定义对象排在PriorityQueue
。