2013-06-12 55 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