2

基本的に、私はこのようなことをしたいと思います:

patientReference = ((Patient) TreatmentRoomQueue).peekFront();

しかし、私のIDEは、型は変換できないと主張しています。(required: Patient; found: TreatmentRoomQueue<Patient>)。ノードをPatientオブジェクトとしてキャストしようとしていることと、リストの最初のノードを返す必要があるpeekFrontメソッドを呼び出そうとしていることがわかります。しかし、これが違法であることは明らかです。私の構文が間違っている可能性があります。または、これに間違った方法でアプローチしている可能性があります。

この背後にある私の動機は、(架空の)緊急治療室を運営するためのプログラムを持っていることです。私は、TreatmentRoomQueueから誰かを取得して退院させ、WaitingRoomQueueに誰かがいる場合は、それらを治療室に移動する必要があります。LinkedListクラスに組み込まれているJavaを使用していません。独自のリンクリストを使用しています(以前に使用したことがあり、機能することがわかっています)。

リンクリストの代わりに配列を使用してねじ込みと言うこともできますが、リンクリストは理解しにくいので、リンクリストの実装から学ぶべきことがもっとあると思います。

ポインタ、コードスニペット、アドバイス、または何でも大歓迎です!読んでくれてありがとう。

MainクラスでTreatmentRoomQueueを次のように宣言します。

TreatmentRoomQueue<Patient> TreatmentRoomQueue = new TreatmentRoomQueue();

TreatmentRoomQueueのコードは次のとおりです。

public class TreatmentRoomQueue <ClassType> 
{
    private Node frontQueueNodeRef = null;
    private Node backQueueNodeRef = null;
    private int counter = 0;

    private class Node 
    {
      private ClassType classTypeObjectRef;
      private Node nextNodeRef;
      Node(ClassType newClassTypeObjectRef)
      {
          classTypeObjectRef = newClassTypeObjectRef;
      }
    }

    private Node peekFront()
    {
        return frontQueueNodeRef;
    }

    public void enqueue(ClassType enqueueObjectRef) 
    {            
     Node queueNodeRef = new Node(enqueueObjectRef);
     if (frontQueueNodeRef == null)
     {
         frontQueueNodeRef = backQueueNodeRef = queueNodeRef;
     }
     else {
         backQueueNodeRef.nextNodeRef = queueNodeRef;
         backQueueNodeRef = queueNodeRef;
         counter++;
     }

    }

    public ClassType dequeue() 
    {
    if ( frontQueueNodeRef == null )
    {
        return null;
    } else {
    ClassType firstClassTypeObjectRef = frontQueueNodeRef.classTypeObjectRef;
    frontQueueNodeRef = frontQueueNodeRef.nextNodeRef;
    counter--;
    return firstClassTypeObjectRef;
    }
    }

    public boolean isFull()
    {
        return false;
    }

    public boolean isEmpty()
    {
        return frontQueueNodeRef == null;
    }     
}
4

2 に答える 2

4

まず、リストから取得する要素ではなく、リストをキャストします。あなたがする必要があるのは、括弧を正しい場所に移動することです:

patientReference = (Patient) (TreatmentRoomQueue.peekFront());

括弧を配置した方法で、Javaは最初にキャストTreatmentRoomQueueを試み、その後、オブジェクトのメソッドPatientを呼び出そうとしました。peekFront()Patient

次に、キューのフロント要素を確認するためのパブリックメソッドを作成する必要があります。

private Node peekFront()

との方法

public ClassType peekFront()
{
    return frontQueueNodeRef.classTypeObjectRef;
}

classTypeObjectRefですので、で利用できるようにするprivate必要があります。publicpeekFront

于 2012-10-14T01:07:20.017 に答える
1

ポインタ、コードスニペット、アドバイス、または何でも大歓迎です!

あなたが尋ねたので、ここに私のアドバイス/何でもあります:

と呼ばれる変数TreatmentRoomQueueは、すべての賢明なJavaコーディング標準におけるコーディング標準違反です。変数にクラス識別子パターンを使用しました。変数識別子の形式treatmentRoomQueueは(定数でない限りstatic final...その場合は)である必要がありますTREATMENT_ROOM_QUEUE

通常、これは小さなことですが、この場合、問題はさらに複雑になります。

 TreatmentRoomQueue<Patient> TreatmentRoomQueue = new TreatmentRoomQueue();

これで、同じ変数名と型名ができました...ただし、名前は異なります!!! JLSは、識別子をどのように解釈するか(つまり、コンパイラーが変数名として読み取るか、クラス名として読み取るか)を指定します...しかし、通常の人間のJavaプログラマーは通常、これらの規則を理解せず、読み取る傾向があります。それらは間違った方法です。

確かに、これはあなたが見たいくつかの紛らわしいコンパイルエラーの原因だったかもしれません!

(通常のプログラマーはJLSの識別子の曖昧性解消規則を理解する必要があると言っているとは思わないでください。私が言っているのは、通常の人間のプログラマーがセマンティックに陥ることなくコードを読み取れるように、受け入れられているコーディング標準に従う必要があるということです。マントラップ!)

于 2012-10-14T01:44:05.133 に答える