我在"Type mismatch: cannot convert from Object to E"
方法的最后一行收到此错误pop()
。
节点
public class Node<E> {
E item;
Node next;
Node(E item) {
this.item = item;
this.next = null;
}
Node(E item, Node next) {
this.item = item;
this.next = next;
}
}
堆栈
import java.util.NoSuchElementException;
public class Stack<E> {
private Node head;
private int size;
Stack() {
head = null;
size = 0;
}
public void push(E item) {
head = new Node (item, head);
size++;
}
public E pop() throws NoSuchElementException {
Node nodeToBePopped;
if (size == 0) {
throw new NoSuchElementException();
}
nodeToBePopped = head;
head = head.next;
size--;
return nodeToBePopped.item;
}
}
我不明白为什么在Node类中声明为E类的情况下会发生错误。为什么我必须在此实例中进行显式转换?
答案 0 :(得分:2)
这是Stack<E>
中的问题:
private Node head;
同样晚些时候:
Node nodeToBePopped;
在Node<E>
本身:
Node next;
您在此处使用原始类型 Node
,因此所有仿制品都会丢失。有关原始类型的详细信息,请参阅Java Generics FAQ。
只需将变量类型更改为Node<E>
,就可以了。
我还建议使用private
字段,并且仅在首次使用时声明局部变量 - 因此您的pop
方法将成为:
public E pop() throws NoSuchElementException {
if (size == 0) {
throw new NoSuchElementException();
}
Node<E> nodeToBePopped = head;
head = head.next;
size--;
return nodeToBePopped.item;
}
或者实际上,只需在更改head
引用的内容之前找到要从head
返回的值:
public E pop() throws NoSuchElementException {
if (size == 0) {
throw new NoSuchElementException();
}
E previousHeadValue = head.item;
head = head.next;
size--;
return previousHeadValue;
}
答案 1 :(得分:0)
将head
和nodeToBePopped
的类型更改为Node<E>
这是因为您尚未指定Stack<E>
只包含Node<E>
类型的元素
同样更改push
方法以及next
中的Node<E>
变量。