我正在学习泛型,并希望创建一个通用的链表。
但是我得到了编译时错误。
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();
}
}
请告诉我为什么会收到此错误?
答案 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}}字段上课没有申报
相同的类型(也不可转换)。