2012-09-09 118 views
2

我想在自定义类上使用优先级队列(java.util.PriorityQueue)。据我所知,时Queue类使用可比接口,所以我实现它在我的自定义类:具有优先级队列的Java可比较对象

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) 

我在做什么错?据我记得,这是我将如何实施可比较的。感谢所有的答案。

+5

您确定'Comparable '中的'State'是正确的,而不是'java.lang.Thread.State'或'javax.swing.plaf.nimbus.State'例如? – amit

+1

@amit在这种情况下是否会打印该类的合格名称?看来这个问题可能是他忘了重新编译'State'。 – oldrinb

+0

@oldrinb你说的对,就是这样!我认为它会编译,因为我在之前的几个地方使用了这个对象,但是我想它并没有出于某种原因。但分别编译它的伎俩。谢谢。 – Sefu

回答

3

amit原本在他的评论是非常明智的忠告,建议;从本质上讲,确保你不是指另一个名为State的类,它从视图中隐藏了你自己的State,例如。 java.lang.Thread.Statejavax.swing.plaf.nimbus.State。这通常是很多错误的原因,所以一定要记住这一点。

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

+0

你能否详细解释一下,我得到的是同样的错误,但无法理解你的答案。 –

1

您的代码在我的Eclipse IDE中正常工作。 也许你从一个不同的包中导入了一个类的状态?