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自分自身を隠しているという名前の別のクラスを参照していないことを確認してください。多くの場合、これが多くのバグの原因となるため、これを覚えておいてください。Statejava.lang.Thread.Statejavax.swing.plaf.nimbus.State

残念ながら、ここではそうではありません。コメントで指摘したように、その場合、例外は例外メッセージの一部として他のものの修飾名を出力します。State修飾名が だったので、State再コンパイルするのを忘れた可能性が高いのは理にかなっていますState。:-)

于 2012-09-09T20:40:11.133 に答える
1

あなたのコードは私のEclipseIDEで正しく機能しています。別のパッケージからクラスStateをインポートしたのではないでしょうか。

于 2012-09-09T20:20:33.847 に答える