通用代码出错

时间:2014-07-20 08:25:03

标签: java

我在"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类的情况下会发生错误。为什么我必须在此实例中进行显式转换?

2 个答案:

答案 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)

headnodeToBePopped的类型更改为Node<E>

这是因为您尚未指定Stack<E>只包含Node<E>类型的元素

同样更改push方法以及next中的Node<E>变量。