1

私のデータ構造クラスでは、洗車をシミュレートするプログラムを作成しようとしています。優先キューを使用して、高級車に通常の車よりも高い優先度を与えたいと考えています。私が抱えている問題は、Javaが「Object」を「ArrayQueue」(単純なFIFO実装)として型キャストできないことに関係しています。何が間違っているので、どうすれば修正できますか?

public class PriorityQueue<E>
{

    private ArrayQueue<E>[] queues;
    private int highest=0;
    private int manyItems=0;


    public PriorityQueue(int h)
    {
        highest=h;
        queues = (ArrayQueue<E>[]) new Object[highest+1];   <----problem is here
    }


    public void add(E item, int priority)
    {
        queues[priority].add(item);
        manyItems++;
    }


    public boolean isEmpty( )
    {
        return (manyItems == 0);
    }


    public E remove()
    {
        E answer=null;
        int counter=0;

        do
        {
            if(!queues[highest-counter].isEmpty())
            {
                answer = queues[highest-counter].remove();
                counter=highest+1;
            }
            else
                counter++;
        }while(highest-counter>=0);

        return answer;
    }
}

編集

この質問への迅速な回答をありがとうございました。私はあなたのアドバイスともう1つのコードに従うことで問題を解決しました:

public PriorityQueue(int h)
{
    highest=h;
    queues = new ArrayQueue[highest+1];
    for(int i = 0; i <= highest; i++)
    {
        queues[i] = new ArrayQueue();
    }
}
4

2 に答える 2

4

オブジェクトはオブジェクトであり、(ほとんどの場合) ArrayQueue ではありません。したがって、キャストは実際には不可能です。

ジェネリック配列の作成も問題ですが、あなたの場合、これはうまくいくはずです:

public PriorityQueue(int h)
{
    highest=h;
    queues = new ArrayQueue[highest+1];   // Gives an ignorable warning
}

編集

教科書で説明されている方法は正しくありません。この本には新しい改訂サイクルが必要です ;) 提案されたキャストは Java では許可されていません。

String forEverUseless = (String) new Object(); // this will not give an empty String
                                               // but an ouch-that-hurts-Exception

これはより明白です。クラスをそのサブタイプ (派生クラス) の 1 つにキャストすることはできません。これは、配列やジェネリック クラスを含むすべてのクラスに当てはまります。

編集2

さらに 2 つの提案:

  1. 「add」メソッドは、「priority」が優先度の有効な範囲内にあるかどうかをチェックする必要があります。そうでない場合、add は例外をスローします (のように: queue.add(entry, -1))
  2. 通常、remove メソッドには引数があります。キューから削除する要素を指定して呼び出すことができます。(または、意図が他のものである場合は、一般的なキュー操作名poppush、およびpeekを使用することをお勧めします)
于 2010-05-31T06:42:20.687 に答える
1

問題はあなたが言ったこととほとんど同じです - あなたは何かの型Object[]を作ってそれを にキャストしようとしていArrayQueue[]ますが、それらは互換性のある型ではありません。あなたはただやるべきです:

queues = new ArrayQueue[highest+1];
于 2010-05-31T06:41:57.663 に答える