无法从Node <E>转换为Node <E>?

TMG*_*ter 1 java iterator linked-list

我只是从我的一本书中做了一些练习,我很好奇为什么我在eclipse中得到以下错误:

Type mismatch: cannot convert from type DoublyLinkedList.Node<E> to DoublyLinkedList.Node<E>

码:

import java.util.Iterator;
    import java.util.ListIterator;
    import java.util.NoSuchElementException;


public class DoublyLinkedList<E extends Comparable<E>> implements Iterable<E>{

 private int size = 0;
 private Node<E> head;
 private Node<E> tail;

/** Returns a list iterator object for the list at 
 * the specified index
 */

 public DoublyLinkedList(){


}



private static class Node<E> {

    Node<E> next = null;
    Node<E> prev = null;
    E data;

    public Node(E dataItem){
        data = dataItem;
    }

    public Node(E dataItem, Node<E> previous, Node<E> nextNode){
        this(dataItem);
        prev = previous;
        next = nextNode;
    }

}


private class MyListIter<E> implements ListIterator<E>{

    private Node<E> lastReturned; // a link reference to the last item that was returned
    private Node<E> nextItem; // a link reference to the next item in the list
    /** The index of the current position */ 
    private int index = 0;

    public MyListIter(int pos){
        if (pos < 0 || pos > size)
            throw new IndexOutOfBoundsException("Invalid index: " + index);
        lastReturned = null;
        if (pos == size){
            index = size;
            nextItem = null;
        } else { // otherwise we will start at the beginning of the list, and loop until the position in the argument
            nextItem = head; // ERROR
            for (index = 0; index < pos; index++){
                nextItem = nextItem.next; // next item will always reference the list node that is called by the next method
            }

        }
    }

    @Override
    public void add(E element) {
        if (head == null){
            Node<E> newNode = new Node<E>(element);
            head = newNode; // ERROR
            tail = head;
        }


    }
    @Override
    public boolean hasNext() {
        return nextItem != null; // just checks to make sure there is a node following the current node
    }
    @Override
    public boolean hasPrevious() {
        return (nextItem == null && size != 0) || nextItem.prev != null;
    }
    @Override
    public E next() {
        if (!hasNext())
            throw new NoSuchElementException("There is no node at that location");
        lastReturned = nextItem;
        nextItem = nextItem.next;
        index++;
        return lastReturned.data;
    }
    @Override
    public int nextIndex() {
        // TODO Auto-generated method stub
        return 0;
    }
    @Override
    public E previous() {
        if (!hasPrevious())
            throw new NoSuchElementException();
        if (nextItem == null) // the iterator is at the end of the list
            nextItem = tail; // therefore, the nextItem is at the tail, so the previous is the tail. ERROR HERE TOO
        else
            nextItem = nextItem.prev;
        lastReturned = nextItem;
        index--;
        return lastReturned.data;
    }
    @Override
    public int previousIndex() {
        // TODO Auto-generated method stub
        return 0;
    }
    @Override
    public void remove() {
        // TODO Auto-generated method stub

    }
    @Override
    public void set(E arg0) {
        // TODO Auto-generated method stub

    }



}


@Override
public Iterator<E> iterator() {
    // TODO Auto-generated method stub
    return null;
}


}
Run Code Online (Sandbox Code Playgroud)

我评论了我在3个不同位置得到错误的确切位置.如果您能提供任何反馈,我会很感激.我的书没有解决它,我已经搜索过,似乎无法得到我正在寻找的答案.

Col*_*inD 5

您已经声明了两种不同的泛型类型:E(for Node)和E extends Comparable<E>(for DoublyLinkedList).

这里的主要问题可能是MyListIter,这是一个非静态的内部类,因此自动继承了它DoublyLinkedList的定义E.因为它继承了定义E,所以你应该将其声明为

private class MyListIter implements ListIterator<E>
Run Code Online (Sandbox Code Playgroud)

但你做了它MyListIter<E>,它正在重新定义E比不同的东西EDoublyLinkedList用户(隐含的E extends ObjectE extends Comparable<E>).

认为 Node应该按原样工作,因为它是一个嵌套类(带有static关键字)并且不继承Efrom 的定义DoublyLinkedList.但是,这里将它声明为DoublyLinkedList(private class Node)的非静态内部类可能是有意义的MyListIter.

此外,您应该允许E成为某种类型的类型,Comparable通过声明它来实现E extends Comparable<? super E>.

  • @TMGunter:如果你声明一个没有`static`关键字的内部类,那个内部类的实例都必须属于包含类的特定_instance_.因此,它们可以自动访问为包含类声明的泛型类型(在本例中为"E").我实际上不确定`Node`是一个问题,因为它有`static`关键字,因此是一个不继承`E`定义的嵌套类.`MyListIter`可能是真正的问题,因为它确实继承了`E`的定义,但也声明了它自己的(冲突的)定义. (2认同)