Java: 使用工厂实例化类型 T 的数组对象

Java: Instantiating array object of type T using a factory

我想像这样实例化一个 T 类型的数组:

items = new T[maxQue];

到目前为止,这是我的代码,我相信一种非反射方法:

interface MyFactory<T>
{
   T[] newObject();
}

public class Queue< T extends Comparable<T> > {

   private int front;
   private int rear;
   private T[] items;
   private int maxQue;
   private static final int MAX_ITEMS = 1000;

   public Queue(MyFactory<T> factory) {
      maxQue = MAX_ITEMS + 1;
      front = maxQue - 1;
      rear = maxQue - 1;

      items = factory.newObject();
      items = new T[maxQue];
   }
}

{ items = factory.newObject();工作并解决了编译器错误,但我不知道如何使用 MyFactory 接口将数组的大小设置为 maxQue。

附带一提,虽然我知道反射在 Java 中的定义,谁能用外行的术语 and/or 工厂的概念?

编辑:在这里找到了对反射的恰当描述: What is reflection and why is it useful?

对于什么时候应该避免反射以及它是否适合创建数组,我还是有点不清楚。

您可以创建一个 T 扩展类型的数组,因此它可能适合也可能不适合您使用扩展类型 (Comparable),或者只是 Object:

public class Queue<T extends Comparable<T> > {

    private int front;
    private int rear;
    private Comparable[] items;
    private int maxQue;
    private static final int MAX_ITEMS = 1000;

    public Queue() {
        maxQue = MAX_ITEMS + 1;
        front = maxQue - 1;
        rear = maxQue - 1;

        items = new Comparable[maxQue];
    }
}

出队或需要 T 时,只需转换为 T

@SuppressWarnings("unchecked")
public T dequeue(){
    return (T)items[0];
}

我的和immibis的解决方案都在这里:

如果 T 是类型参数,则永远不能在 Java 中使用 new T,因为他们选择了实现泛型的方式。但是,有一些方法可以使用反射来解决它。

因为你已经有了一个T[]类型的对象,你可以使用反射来获取它的类型,然后创建一个新的那个类型的数组。

items.getClass().getComponentType() 会给你 T 的 Class。您可以使用 items = (T[])Array.newInstance(items.getClass().getComponentType(), maxQue).

创建一个这种大小的新数组