2

キューの先頭と末尾で個別のロックを使用する配列に関して、同時循環キューを実装しています。キュー内の各ノードは次のようになります。

  private class Node<T> 
  {
        public T item;
        ReentrantLock lock = new ReentrantLock();
        Node(){}
        void lock() {lock.lock();}
        void unlock() {lock.unlock();}
  }

キュー クラスのコンストラクタでキューを作成できません。

public Queue(int capacity) {
    items = (Node[]) new Object[capacity];//This line gives the problem
    head = size = 0;
  }

ここで解決策を見つけましたが、このコード:

@SuppressWarnings("unchecked")
    Node<T>[] slots = (Node<T>[]) new Node<?>[capacity];

次のコンパイラ エラーが発生します。

Cannot create a generic array of Queue<T>.Node<?>

私の質問は、汎用オブジェクトの配列を初期化する正しい方法は何ですか?

4

2 に答える 2

4

Node<T>静的であるべきだと思います。

private static class Node<T> 
{
    public T item;
    ReentrantLock lock = new ReentrantLock();

    void lock() {lock.lock();}
    void unlock() {lock.unlock();}
}

...

@SuppressWarnings("unchecked")
Node<T>[] slots = (Node<T>[]) new Node<?>[capacity];

通常、次の 2 つのオプションがあります。

非静的クラス

public class Queue2<T> {

    public Queue2(int capacity) {   

        Queue2<T>.Node2[] slots2 =  new Queue2.Node2[capacity];     
    }


    private class Node2 
    {
        private T item;
        ReentrantLock lock = new ReentrantLock();

        public Node2(Object object) {}
        void lock() {lock.lock();}
        void unlock() {lock.unlock();}
    }
}

静的クラス

public class Queue<T>  {

    public Queue(int capacity) {

        Queue.Node<T>[] slots = (Node<T>[]) new Node<?>[capacity];
    }   

    private static class Node<T> 
    {
        public T item;
        ReentrantLock lock = new ReentrantLock();

        void lock() {lock.lock();}
        void unlock() {lock.unlock();}
    }
}

最初の例ではノード クラスQueue2<T>.Nodeを と呼びますが、2 番目の例ではノード クラスを と呼びますQueue.Node<T>

ここに示した 2 つの選択肢のうち、2 番目の方法をお勧めします。静的ではない入れ子になったクラスは、一般にそのインスタンスのコンポーネントにアクセスする可能性があるため、囲んでいるインスタンスへの参照を含めることによって実装されます。通常、ネストされた静的クラスは、より単純で効率的です。

于 2013-10-20T14:24:30.190 に答える
0

これをコンパイルするには、他に 2 つの方法があります。

  1. Node公開クラスを作る

  2. Node非静的なプライベート クラスとして保持し、インスタンス化からワイルドカードを削除します。

    Node<T>[] slots = (Node<T>[]) new Node[capacity];

于 2013-10-20T14:39:00.077 に答える