迭代器设计模式的泛型类型

时间:2014-01-15 17:42:41

标签: java generics

我正在尝试为泛型类型实现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;
        }

    }
}

2 个答案:

答案 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()方法可以将其indexnames.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;
    }