我想实例化一个类型为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中反射的定义,但任何人都可以用外行的方式表达它和/或工厂的概念吗?
编辑:在这里找到一个体面的反思描述: What is reflection and why is it useful?
我仍然不清楚何时应该避免反射以及是否适合创建数组。
答案 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