只需将一个通用集合包装在自定义类中,即可以控制固定大小的集合。例如:
class Queue<T> {
private ArrayList<T> q;
private int size;
public Queue(int size) {
this.size = size;
this.q = new ArrayList<T>(size);
}
public int size() {
return size;
}
// ...
public T get(int index) {
if (index > q.size()) {
return null;
}
// ... or whatever
return q.get(index);
}
}
** 编辑 **
或者更具体地说,建立自己的最爱兼容的通用类。例如:
public class FixedQueue<E> extends AbstractList<E> {
private Object[] queue;
public FixedQueue(int size) {
queue = new Object[size];
}
@Override
public E set(int index, E element) {
Object old = queue[index];
queue[index] = element;
modCount++;
return (E) old;
}
@Override
public E get(int index) {
return (E) queue[index];
}
@Override
public int size() {
return queue.length;
}
@Override
public E remove(int index) {
Object old = queue[index];
System.arraycopy(queue, index+1, queue, index, queue.length - index - 1);
modCount++;
return (E) old;
}
}
这个未经测试的类将允许get
和set
和remove
操作,但不add
等,但你可以实现它自己的规格,如果你想。如果您需要添加功能(例如ensureCapacity
)来实现它,而不触及任何其他源,则实现一个类而不是使用固定大小的数组将允许您执行此操作。
** UPDATE **
我刚才看到您的编辑,基本上,你开始出发吧。只需使用一组Object
,当你获得一个元素时,该数组就会转换为泛型类型。例如,请参阅Java的ArrayList
实现。
嗯,你究竟想要做什么? – Falmarri 2011-02-06 07:00:19
@Falmarri - 我试图实现一个循环队列,并希望使用“缓冲”结构作为基础数据存储。我需要能够分配一个固定大小的缓冲区,并通过索引访问元素。 – ripper234 2011-02-06 07:05:43
但是,为什么你需要一个缓冲区,可以容纳你不知道在编译时的任意对象? – Falmarri 2011-02-06 07:07:11