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