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。
- 如何声明这个大小为 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)
.
创建一个这种大小的新数组
我想像这样实例化一个 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 中的定义,谁能用外行的术语 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)
.