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

时间:2015-07-17 23:39:11

标签: java generics reflection constructor queue

我想实例化一个类型为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。

  • 如何声明此数组的大小为maxQue?

另一方面,虽然我知道Java中反射的定义,但任何人都可以用外行的方式表达它和/或工厂的概念吗?

编辑:在这里找到一个体面的反思描述: What is reflection and why is it useful?

我仍然不清楚何时应该避免反射以及是否适合创建数组。

2 个答案:

答案 0 :(得分:3)

如果new T是类型参数,则永远不能在Java中使用T,因为他们选择实现泛型。但是,有很多方法可以使用反射。

由于您已经有了T[]类型的对象,您可以使用反射来获取其类型,然后创建该类型的新数组。

items.getClass().getComponentType()会给你T级。您可以使用items = (T[])Array.newInstance(items.getClass().getComponentType(), maxQue)创建此大小的新数组。

答案 1 :(得分:2)

您可以创建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的两个解决方案都包含在这里:https://stackoverflow.com/a/530289/360211