2013-06-12 54 views
3

我在學習設計模式從「深入淺出」系列。這本書有點過時(沒有泛型),所以我試圖重寫它的一部分。我應該寫包裝IteratorEnumerator方法工作,並與ArrayList的測試。的Java:實現通用的迭代

「原始」的版本看起來像這樣(下圖)。我試圖讓它成爲通用類,如<E>甚至<T<E>>,但它沒有奏效。我也想確保它可以用於任何類型的迭代器,不僅僅是ArrayList就像ArrayList<T>。什麼是實施這個的正確方法?

public class IteratorWrapper implements Enumeration { 
    Iterator iterator; 

    public IteratorWrapper(Iterator iterator){ 
     this.iterator = iterator; 
    } 

    public boolean hasMoreElements(){ 
     return iterator.hasNext(); 
    } 

    //Return generic Type T 
    public Object nextElement(){ 
     return iterator.next(); 
    } 
} 

測試類

public class WrapperTest { 
    public static void main(String[] args){ 
     ArrayList<String> arrayList = new ArrayList<String>(); 
     arrayList.add("element1"); 
     arrayList.add("element2"); 

     //This part will be rewritten when wrapper will work 
     IteratorWrapper iteratorWrapper = new IteratorWrapper(arrayList.iterator()); 

     while(iteratorWrapper.hasMoreElements()){ 
      System.out.println(iteratorWrapper.nextElement()); 
     } 
    } 
} 
+0

你是怎麼嘗試?你得到了什麼錯誤? – SLaks

回答

3

您可以添加一個泛型參數是這樣的:

public class IteratorWrapper<T> implements Enumeration<T> { 
    Iterator<T> iterator; 

    public IteratorWrapper(Iterator<T> iterator){ 
     this.iterator = iterator; 
    } 

    public boolean hasMoreElements(){ 
     return iterator.hasNext(); 
    } 

    public T nextElement(){ 
     return iterator.next(); 
    } 
} 

那麼,你的初始化將是這樣的:

IteratorWrapper<String> iteratorWrapper = new IteratorWrapper<String>(arrayList.iterator()); 
+0

奇怪...我嘗試了這個確切的副本,但它拋出了我的錯誤。我想問題在於創建對象並將迭代器傳遞給它。順便說一句。我也試過這個'IteratorWrapper > iteratorWrapper =新IteratorWrapper >(arrayList.iterator());'和它的作品 - 但...它也給init我的對象適當的方式? – ashur

+1

@ashur:No;你的迭代器不返回ArrayLists。閱讀編譯器警告。 – SLaks

+0

它不與Eclispe的和Java 6編譯反正一點是,你的包裝(和迭代器)不必知道迭代來自一個ArrayList,所以通用類型並不需要一提的ArrayList – Guillaume