具有优先级队列的Java可比较对象
我试图在自定义类上使用优先级队列(java.util.PriorityQueue)。我知道PriorityQueue类使用可比较的接口,所以我在自定义类中实现了它:具有优先级队列的Java可比较对象,java,interface,queue,comparable,Java,Interface,Queue,Comparable,我试图在自定义类上使用优先级队列(java.util.PriorityQueue)。我知道PriorityQueue类使用可比较的接口,所以我在自定义类中实现了它: public class State implements Comparable<State> { public int val; public State(){ this.val = 0; } public int compareTo(State other){
public class State implements Comparable<State> {
public int val;
public State(){
this.val = 0;
}
public int compareTo(State other){
return this.val - other.val;
}
}
我做错了什么?就我所记得的,这就是我将如何实现的。谢谢您的回答。您的代码在我的Eclipse ide中工作正常。
可能您从其他包导入了类状态?您的代码在我的Eclipse ide中工作正常。 也许您从另一个包导入了类状态?最初在他的评论中提出了一条非常明智的建议;本质上,请确保您没有引用另一个名为
State
的类,该类在视图中隐藏您自己的State
,例如java.lang.Thread.State
和javax.swing.plaf.nimbus.State
。这通常是导致许多错误的原因,因此请确保记住这一点
不幸的是,这里的情况并非如此。正如我在中所指出的,在这种情况下,异常将打印任何其他状态的限定名称,作为异常消息的一部分。由于限定名称是状态
,因此您可能忘记了重新编译状态
:-) 最初在他的评论中提出了一条非常明智的建议;本质上,请确保您没有引用另一个名为State
的类,该类在视图中隐藏您自己的State
,例如java.lang.Thread.State
和javax.swing.plaf.nimbus.State
。这通常是导致许多错误的原因,因此请确保记住这一点
不幸的是,这里的情况并非如此。正如我在中所指出的,在这种情况下,异常将打印任何其他状态的限定名称,作为异常消息的一部分。由于限定名称是状态
,因此您可能忘记了重新编译状态
:-) 你确定Comparable
中的状态是正确的,而不是java.lang.Thread.State
或javax.swing.plaf.nimbus.State
吗?@amit在这种情况下,异常不会打印类的限定名吗?看来问题可能是他忘了重新编译State
@oldrinb你是对的,就是这样!我假设它会编译,因为我以前在几个地方使用过该对象,但我想出于某种原因它不会。但是单独编译就可以了。谢谢。@oldrinb:这是一个答案。发布。@Richard:-)你确定Comparable
中的状态是正确的,而不是java.lang.Thread.State
或javax.swing.plaf.nimbus.State
例如?@amit在这种情况下,异常不会打印类的限定名吗?看来问题可能是他忘了重新编译State
@oldrinb你是对的,就是这样!我假设它会编译,因为我以前在几个地方使用过该对象,但我想出于某种原因它不会。但是单独编译就可以了。谢谢。@oldrinb:这是一个答案。贴出来。@Richard:-)你能详细解释一下吗,我犯了同样的错误,但无法理解你的答案。你能详细解释一下吗,我犯了同样的错误,但无法理解你的答案。
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)