2015-09-02 2 views
1

в методе «следующий», реализованном в Iterator, есть ошибка. Я не могу вернуть значение «e», потому что Java говорит, что это тип объекта. Я не понимаю, почему. Потому что в классе Elem, если я даю, например, объект Point, он должен вернуть его. Но я не очень хорошо знаю дженерики, может быть, кто-то может объяснить плз. Thnx)Как мне вернуться в «следующий» метод Итератора <E>?

package Tutorial3; 

import java.util.Iterator; 


public class MyLinkedList<E> implements Iterable<E> { 
    Elem<E> head; 
    Elem<E> tail; 

    public MyLinkedList() { 
     head = null; 
     tail = null; 
    } 

    public void add(E e) { 
     Elem<E> newElem = new Elem<E>(e); 
     if (head == null) { 
      tail.setNext(newElem); 
      head = newElem; 
      tail = newElem; 
     } else { 
      tail.setNext(newElem); 
      tail = newElem; 
     } 
    } 

    public void addToHead(E e) { 
     Elem<E> newElem = new Elem<E>(e); 
     newElem.setNext(head); 
     head = newElem; 
    } 

    public void addToTail(E e) { 
     add(e); 
    } 

    public void removeFirstValue() { 
     head = head.getNext(); 
    } 

    public void removeLastValue() { 
     Elem<E> cursor; 
     cursor = head; 
     while (cursor.getNext() != tail) { 
      cursor = cursor.getNext(); 
     } 
     tail = cursor; 
     tail.setNext(null); 
    } 

    public E get(int index) { 
     if ((index + 1) > size()) { 
      throw new IndexOutOfBoundsException("Index: " + index + " Size: " + size()); 
     } else { 
      Elem<E> cursor; 
      cursor = head; 
      int i = 0; 
      if (i == index) { 
       return cursor.getE(); 
      } else { 
       while (i != index) { 
        cursor = cursor.getNext(); 
        i++; 
       } 
       return cursor.getE(); 
      } 
     } 
    } 

    public int size() { 
     Elem<E> cursor; 
     cursor = head; 
     int size = 0; 
     while (cursor != null) { 
      size++; 
      cursor = cursor.getNext(); 
     } 
     return size; 
    } 

    @Override 
    public Iterator<E> iterator() { 
     return new MyLinkedListIterator<E>(); 
    } 

    private class MyLinkedListIterator<T> implements Iterator<T> { 
     private Elem elem = head; 

     @Override 
     public boolean hasNext() { 
      return elem.getNext() != null; 
     } 

     @Override 
     public T next() { 
      return elem.getNext().getE(); //here is mistake: can't return e 
              //required : T, Found: Object 
     } 
    } 
} 

package Tutorial3; 

public class Elem<E> { 
    private E e; 
    private Elem<E> next; 

    public Elem(E e) { 
     this.e = e; 
    } 

    public Elem(E e, Elem<E> next) { 
     this.e = e; 
     this.next = next; 
    } 

    public E getE() { 
     return e; 
    } 

    public void setE(E e) { 
     this.e = e; 
    } 

    public Elem<E> getNext() { 
     return next; 
    } 

    public void setNext(Elem<E> next) { 
     this.next = next; 
    } 
} 

ответ

3

Это должно быть

private class MyLinkedListIterator implements Iterator<E> { 
    private Elem<E> elem = head; 

    @Override 
    public boolean hasNext() { 
     return elem.getNext() != null; 
    } 

    @Override 
    public E next() { 
     return elem.getNext().getE(); 
    } 
} 

Вашего MyLinkedListIterator типа должен наследовать E от внешнего MyLinkedList<E> типа, вместо того, чтобы объявить свой собственный тип T элемента, а затем усугубляется, что при использовании необработанного Elem тип вместо Elem<E>.

+0

Спасибо! :) Теперь он работает –

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