2

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

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

4

2 回答 2

3

阿米特最初在他的评论中提出了一条非常明智的建议;本质上,请确保您没有引用另一个名为State的类,该类将您自己State的视图隐藏起来,例如java.lang.Thread.Stateand javax.swing.plaf.nimbus.State。这通常是许多错误的原因,因此请确保记住这一点。

不幸的是,这里不是这样。正如我在评论中指出的那样,在这种情况下,异常将打印任何其他的限定State名称作为异常消息的一部分。由于限定名称是State,因此您可能忘记重新编译是有道理的State。:-)

于 2012-09-09T20:40:11.133 回答
1

您的代码在我的 Eclipse ide 中正常工作。也许您已经从不同的包中导入了一个类 State?

于 2012-09-09T20:20:33.847 回答