【问题标题】:Array of generic nodes Java通用节点数组 Java
【发布时间】:2013-10-20 13:59:30
【问题描述】:

我正在根据一个使用单独锁的数组来实现一个并发循环队列 在队列的头部和尾部。队列中的每个节点如下所示:

  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;
  }

我找到了解决方案here,但是这段代码:

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

给出以下编译器错误:

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

我的问题是初始化泛型对象数组的正确方法是什么?

【问题讨论】:

标签: java arrays generics


【解决方案1】:

我认为Node&lt;T&gt; 应该是静态的。

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];

一般我们有两种选择:

非静态类

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&lt;T&gt;.Node,而您将第二个示例中的节点类称为Queue.Node&lt;T&gt;

在此处显示的两个备选方案中,第二个更可取。嵌套类不是 static 通过包含对封闭实例的引用来实现,因为它们通常可以访问该实例的组件。静态嵌套类通常更简单、更高效。

【讨论】:

    【解决方案2】:

    还有另外两种编译方式。

    1. Node 设为公共类

    2. Node 保留为私有的非静态类,并从实例化中删除通配符:

      Node&lt;T&gt;[] slots = (Node&lt;T&gt;[]) new Node[capacity];

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-28
      • 1970-01-01
      • 1970-01-01
      • 2021-02-24
      相关资源
      最近更新 更多