java中的通用链接列表

时间:2017-05-01 07:12:25

标签: java generics linked-list

我正在学习泛型,并希望创建一个通用的链表。

但是我得到了编译时错误。

Type mismatch: cannot convert from LinkedList<E>.Node<E> to
 LinkedList<E>.Node<E>
public class LinkedList<E> {
    private Node<E> head = null;

    private class Node<E> {
        E value;
        Node<E> next;

        // Node constructor links the node as a new head
        Node(E value) {
            this.value = value;
            this.next = head;//Getting error here
            head = this;//Getting error here
        }
    }

    public void add(E e) {
        new Node<E>(e);
    }

    public void dump() {
        for (Node<E> n = head; n != null; n = n.next)
            System.out.print(n.value + " ");
    }

    public static void main(String[] args) {
        LinkedList<String> list = new LinkedList<String>();
        list.add("world");
        list.add("Hello");
        list.dump();
    }
}

请告诉我为什么会收到此错误?

1 个答案:

答案 0 :(得分:5)

此处openwrt E隐藏private class Node<E> {此处:E

public class LinkedList<E> {类不需要是泛型。 它包含一个泛型字段Node,它取决于value中的E泛型。这就够了。

LinkedList

编辑

  

你能不能告诉我当它抛出时编译器想要说什么   错误消息

当你写:

public class LinkedList<E> {
    private Node head = null;

    private class Node {
        E value;
        Node next;

        // Node constructor links the node as a new head
        Node(E value) {
            this.value = value;
            this.next = head;//Getting error here
            head = this;//Getting error here
        }
    }

    public void add(E e) {
        new Node(e);
    }

    public void dump() {
        for (Node n = head; n != null; n = n.next)
            System.out.print(n.value + " ");
    }

    public static void main(String[] args) {
        LinkedList<String> list = new LinkedList<String>();
        list.add("world");
        list.add("Hello");
        list.dump();
    }
}

你必须要知道这两个变量不依赖于相同的类型。

  • this.next = head; 是以next类在Node<E>类中声明的字段:Node<E> next

  • head是以LinkedList<E>类在Node<E> head类中声明的字段:E

Node<E>类中声明的E类型不被编译器视为LinkedList<E>中声明的this.next = head; 类型,因为这些是两种不同的类型声明

所以这里:

LinkedList<E>.Node<E>

编译器无法从LinkedList<E>.Node<E>分配到Node<E> next,因为Node<E>类的Node<E> head字段和LinkedList<E>的{​​{1}}字段上课没有申报 相同的类型(也不可转换)。