只需將一個通用集合包裝在自定義類中,即可以控制固定大小的集合。例如:
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