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



我想实例化一个类型为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中反射的定义,但有人能把它和/或工厂的概念用外行的术语解释一下吗?

编辑:在这里找到了一个不错的反射描述:什么是反射?它为什么有用?

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

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

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

items.getClass().getComponentType()将给你T的课。您可以使用items = (T[])Array.newInstance(items.getClass().getComponentType(), maxQue)创建一个这样大小的新数组。

您可以创建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

相关内容

  • 没有找到相关文章

最新更新