簡體   English   中英

泛型類型的迭代器設計模式

[英]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()方法可以將其indexnames.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM