[英]Iterator design pattern for generic types
我正在嘗試為通用類型實現Iterator設計模式。 我不能使用泛型數組來存儲集合,有人可以幫助我為泛型類型設計Iterator模式。
我的代碼在這里:
public class NamesRepository<T> implements Container<T> {
public NamesRepository(){
names = new T[]; // Compilation error
}
public T names[];
@Override
public Iterator<T> getIterator() {
return new NameIterator();
}
private class NameIterator implements Iterator<T>{
private int index;
@Override
public boolean hasNext() {
if(index<names.length)
return true;
return false;
}
@Override
public T next() {
if(this.hasNext())
return names[index++];
return null;
}
}
}
如前所述, 您不能使用type參數直接創建通用數組 。 如果必須使用數組,則可以遵循該問題的答案。
但是,您可以改為創建類型參數的List
。 無需任何技巧,而且更靈活。
public NamesRepository(){
names = new ArrayList<T>(); // Easy creation
}
public List<T> names;
然后,迭代器的hasNext()
方法可以將其index
與names.size()
進行比較, next()
方法可以返回names.get(index++)
。 您甚至可以通過調用names.remove(index)
來實現Iterator
接口所需的其他方法remove()
names.remove(index)
。
您不能創建類型為parameter的數組 。 相反,您可以存儲一個Object[]
數組,然后將要返回的元素類型轉換為T
:
public NamesRepository(){
names = new Object[5]; // You forgot size here
}
public Object names[];
然后將next()
方法更改為:
@Override
public T next() {
if(this.hasNext()) {
@SuppressWarnings("unchecked")
T value = (T)names[index++];
return value;
}
return null;
}
您可以真正將hasNext()
方法更改為一行:
@Override
public boolean hasNext() {
return index < names.length;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.