2014-10-15 2 views
0

Я пишу внутренний класс итератора, который выполняет итерацию по списку. Помимо метода remove, я считаю, что я правильно применил все методы итератора, но получаю сообщение об ошибке «Связанное несоответствие: тип E не является допустимым заменителем ограниченного параметра> типа List.Node». Я считаю, что это связано с тем, что Node> реализует Iterable в верхней части моего кода, но я не хочу изменять это, если не нужен. Любые возможные предложения о том, что я должен делать?связанный список итератор inner class-java

public class List<T extends Comparable<L>> implements Iterable<L> { 

    private class Node<N extends Comparable<N>> { 
     private N data; 
     private Node<N> next; 
    } 
    protected Node<L> head; 


    public Iterator<L> iterator() { 

     return new ListIterator<L>(); 

    } 

    public class ListIterator<E extends Comparable<E>> implements Iterator<E> { 

     private Node<E> N = (Node<E>) head; //"Bound mismatch: The type E is not a valid substitute for the bounded parameter <D extends Comparable<D>> of the type List<T>.Node<D>" 

     public boolean hasNext() { 
      return (N.next != null); 
     } 

     public E next() { 
      if (!hasNext()) 
       throw new NoSuchElementException(); 
      else { 
       N = N.next; 
       return N.data; 
      } 
     } 

     public void remove() { 

     } 

    } 
} 

ответ

1

Тип параметра N объявлен как

N extends Comparable<N> 

т.е.. он имеет границы. Он должен быть Comparable себе.

Тип параметра E объявлен как

E 

т.е.. он не имеет границ. Это может быть любой тип, но не обязательно тип Comparable для себя.

Следовательно, вы не можете использовать E, где ожидается N. Рассмотрим добавление тех же границ, что и N, до E.

+0

Хм, могу ли я сделать E расширять N тогда? –

+0

@ Kracie Вам нужно будет иметь 'N', доступный в области' E'. –

+0

Как мне это сделать? Я не думаю, что частные/общественные дела для N как внутренние классы могут видеть, что независимо, я думаю, –

2

Необходимо уменьшить количество типовых типов. Поскольку внутренние классы знают общий тип своего родительского класса, вы должны упростить класс Node и ListIterator:

public class List<L extends Comparable<L>> implements Iterable<L> { 
    private class Node { 
     private L data; 
     private Node next; 
    } 
    protected Node head; 

    public Iterator<L> iterator() { 

     return new ListIterator(); 

    } 

    public class ListIterator implements Iterator<L> { 

     private Node N = head; 

     public boolean hasNext() { 
      return (N.next != null); 
     } 

     public L next() { 
      if (!hasNext()) 
       throw new NoSuchElementException(); 
      else { 
       N = N.next; 
       return N.data; 
      } 
     } 

     public void remove() { 

     } 

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