java中的泛型链表

java中的泛型链表,java,generics,linked-list,Java,Generics,Linked List,我正在学习泛型,想创建一个泛型链表 但我得到以下编译时错误 类型不匹配:无法从LinkedList.Node转换为 LinkedList.Node 公共类链接列表{ 私有节点头=null; 私有类节点{ E值; 节点下一步; //节点构造函数将节点链接为新头 节点(E值){ 这个值=值; this.next=head;//此处出现错误 head=this;//此处获取错误 } } 公共空间添加(E){ 新节点(e); } 公共空转储(){ for(节点n=头;n!=null;n=n.next)

我正在学习泛型,想创建一个泛型链表

但我得到以下编译时错误

类型不匹配:无法从LinkedList.Node转换为
LinkedList.Node
公共类链接列表{
私有节点头=null;
私有类节点{
E值;
节点下一步;
//节点构造函数将节点链接为新头
节点(E值){
这个值=值;
this.next=head;//此处出现错误
head=this;//此处获取错误
}
}
公共空间添加(E){
新节点(e);
}
公共空转储(){
for(节点n=头;n!=null;n=n.next)
系统输出打印(n.value+“”);
}
公共静态void main(字符串[]args){
LinkedList=新建LinkedList();
列表。添加(“世界”);
添加(“你好”);
list.dump();
}
}

请告诉我为什么会出现此错误???

此处
E
私有类节点{隐藏
E
此处:
公共类链接列表{

节点
类不需要是泛型。 它包含一个泛型字段
,它取决于
LinkedList
中的
E
泛型。这就足够了

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();
    }
}
您必须知道这两个变量并不依赖于同一类型

  • next
    是在
    Node
    类中以以下方式声明的字段:
    Node next

  • head
    是在
    LinkedList
    类中声明的一个字段,其方式为:
    Node head

但是
节点
类中声明的
E
类型不被编译器视为与
链接列表
中声明的
E
类型相同,因为这是两个不同的类型声明

因此,这里:

this.next = head;
编译器无法将from
LinkedList.Node
分配给
LinkedList.Node
,因为
Node
类中的
Node next
字段和
LinkedList
类中的
Node head
字段未声明
相同类型(并且也不可转换)。

此处
E
私有类节点{隐藏
E
此处:
公共类链接列表{

节点
类不需要是泛型。 它包含一个泛型字段
,它取决于
LinkedList
中的
E
泛型。这就足够了

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();
    }
}
您必须知道这两个变量并不依赖于同一类型

  • next
    是在
    Node
    类中以以下方式声明的字段:
    Node next

  • head
    是在
    LinkedList
    类中声明的一个字段,其方式为:
    Node head

但是
节点
类中声明的
E
类型不被编译器视为与
链接列表
中声明的
E
类型相同,因为这是两个不同的类型声明

因此,这里:

this.next = head;
编译器无法将from
LinkedList.Node
分配给
LinkedList.Node
,因为
Node
类中的
Node next
字段和
LinkedList
类中的
Node head
字段未声明
相同类型(并且也不可转换)。

您不需要设置
节点
泛型。由于它是一个内部类,由于周围类的泛型性质,它将是泛型的。设置内部类泛型类型E不起作用,因为
类型参数E隐藏类型E
(第4行的编译器警告)您不需要设置
节点
泛型。由于它是一个内部类,因此由于周围类的泛型性质,它将是泛型的。设置内部类泛型类型E不起作用,因为
类型参数E隐藏类型E
(第4行的编译器警告)您能告诉我当编译器抛出错误消息时,它想说什么吗?您能告诉我当编译器抛出错误消息时,它想说什么吗
this.next = head;