2013-06-12 6 views
3

Я изучаю шаблоны проектирования из серии «Head First». Книга немного устарела (нет общих типов), поэтому я пытаюсь переписать ее часть. Я должен написать Wrapper на Iterator для работы Enumerator методов и протестировать его с помощью 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

Странно ... Я попробовал точную копию этого, но он бросил мне ошибку. Я предполагаю, что проблема заключалась в создании объекта и передаче ему итератора. Btw. Я попробовал также этот 'IteratorWrapper > iteratorWrapper = new IteratorWrapper > (arrayList.iterator());' and It works - но ... это также правильный способ инициализации моего объекта? – ashur

+1

@ashur: Нет; ваш итератор не возвращает ArrayLists. Прочтите предупреждения компилятора. – SLaks

+0

Он не компилируется с Eclispe и Java 6. В любом случае, ваша оболочка (и итератор) не должна знать, что итератор поступает из ArrayList, поэтому в родовом типе не нужно указывать ArrayList – Guillaume

Смежные вопросы