2012-09-09 119 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中正常工作。 也許你從一個不同的包中導入了一個類的狀態?