Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 泛型类型的迭代器设计模式_Java_Generics - Fatal编程技术网

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

Java 泛型类型的迭代器设计模式,java,generics,Java,Generics,我正在尝试为泛型类型实现迭代器设计模式。我不能使用泛型数组来存储集合,有人能帮我设计泛型类型的迭代器模式吗 我的代码在这里: public class NamesRepository<T> implements Container<T> { public NamesRepository(){ names = new T[]; // Compilation error } public T names[]; @Overri

我正在尝试为泛型类型实现迭代器设计模式。我不能使用泛型数组来存储集合,有人能帮我设计泛型类型的迭代器模式吗

我的代码在这里:

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;
        }

    }
}
公共类名称存储库实现容器{
公共名称存储库(){
name=newt[];//编译错误
}
公共T名称[];
@凌驾
公共迭代器getIterator(){
返回新名称迭代器();
}
私有类NameIterator实现了迭代器{
私有整数索引;
@凌驾
公共布尔hasNext(){
if(index。相反,您可以存储一个
对象[]
数组,并键入要返回到
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;
    }
@覆盖
公共布尔hasNext(){
返回索引
前面已经讨论过很多次了。如果必须使用数组,您可以按照问题的答案进行操作

但是,您可以创建类型参数的
列表
。不需要技巧,而且更灵活

public NamesRepository(){
    names = new ArrayList<T>();  // Easy creation
}
public List<T> names;
公共名称存储库(){
名称=新建ArrayList();//易于创建
}
公开名单名称;
然后,迭代器的
hasNext()
方法可以将其
索引与
names.size()
进行比较,而
next()
方法可以返回
names.get(index++)
。您甚至可以通过调用
names.remove(index)来实现
iterator
接口
remove()
所需的其他方法