具有Priority Queue的Java Comparable对象

时间:2012-09-09 20:10:10

标签: java interface queue comparable

我正在尝试在自定义类上使用优先级队列(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)

我做错了什么?据我所知,这就是我实现可比性的方式。谢谢你的所有答案。

2 个答案:

答案 0 :(得分:3)

amit最初在他的评论中提出了一个非常明智的建议;实际上,请确保您没有引用另一个名为State的类,该类隐藏了您自己的State视图,例如java.lang.Thread.Statejavax.swing.plaf.nimbus.State。这通常是许多错误的原因,所以请务必记住这一点。

不幸的是,情况并非如此。正如我在a comment中指出的那样,异常将打印其他State限定名称作为异常消息的一部分。由于限定名称为State,因此您可能忘记重新编译State。 : - )

答案 1 :(得分:1)

您的代码在我的Eclipse ide中正常运行。 也许您从其他包中导入了一个类状态?