我正在尝试为泛型类型实现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;
}
}
}
答案 0 :(得分:1)
正如之前多次讨论的那样,you can't directly create a generic array using the type parameter。如果必须使用数组,则可以按照该问题的答案进行操作。
但是,您可以改为创建List
类型参数。不需要任何技巧,而且它更灵活。
public NamesRepository(){
names = new ArrayList<T>(); // Easy creation
}
public List<T> names;
然后,您的迭代器hasNext()
方法可以将其index
与names.size()
进行比较,next()
方法可以返回names.get(index++)
。您甚至可以通过调用Iterator
来实现remove()
界面names.remove(index)
所需的其他方法。
答案 1 :(得分:0)
You cannot create an array of type 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;
}