我正在尝试在自定义类上使用优先级队列(java.util.PriorityQueue)。我知道PriorityQueue类使用Comparable接口,所以我在自定义类中实现了它:
public class State implements Comparable<State> {
public int val;
public State(){
this.val = 0;
}
public int compareTo(State other){
return this.val - other.val;
}
}
要使用队列,我做了:
PriorityQueue<State> q = new PriorityQueue<State>();
q.add(myState1);
q.add(myState2);
// etc.
它正确编译,但我在运行时遇到了这个异常:
Exception in thread "main" java.lang.ClassCastException: State cannot be cast to
java.lang.Comparable
at java.util.PriorityQueue.siftUpComparable(Unknown Source)
at java.util.PriorityQueue.siftUp(Unknown Source)
at java.util.PriorityQueue.offer(Unknown Source)
at java.util.PriorityQueue.add(Unknown Source)
at MapTable.search(MapTable.java:308)
at Map.main(Map.java:67)
我做错了什么?据我所知,这就是我实现可比性的方式。谢谢你的所有答案。
答案 0 :(得分:3)
amit最初在他的评论中提出了一个非常明智的建议;实际上,请确保您没有引用另一个名为State
的类,该类隐藏了您自己的State
视图,例如java.lang.Thread.State
和javax.swing.plaf.nimbus.State
。这通常是许多错误的原因,所以请务必记住这一点。
不幸的是,情况并非如此。正如我在a comment中指出的那样,异常将打印其他State
的限定名称作为异常消息的一部分。由于限定名称为State
,因此您可能忘记重新编译State
。 : - )
答案 1 :(得分:1)
您的代码在我的Eclipse ide中正常运行。 也许您从其他包中导入了一个类状态?