2014-07-20 2 views
-1

Я получаю эту ошибку "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; 
    } 
} 

Stack

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. Почему я должен сделать явное приведение в этом экземпляре?

+0

Пожалуйста, приложите больше усилий для форматирования кода, когда задаете вопросы. Посмотрите предварительный просмотр, прежде чем ударять сообщение, и убедитесь, что он похож на вопрос, который вы хотите прочитать. –

+0

(И, пожалуйста, используйте пробелы вместо вкладок для отступов.) –

+0

Жаль, Джон. В следующий раз я буду уверен. – Prasanna

ответ

2

Это проблема в Stack<E>:

private Node head; 

и также позже:

Node nodeToBePopped; 

И Node<E> сам:

Node next; 

Вы используете сырой типNode he re, поэтому все дженерики теряются эффективно. Дополнительную информацию о типах необработанных см. В разделе 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; 
} 
+0

Спасибо, Джон. Да, я думал о частных полях. Как мне сохранить следующие и переменные item в узле и все еще делать то, что я делаю в Stack? – Prasanna

0

изменить типы head и nodeToBePopped к Node<E>

Это потому, что вы не указали, что Stack<E> будет иметь только элементы типа Node<E>

Аналогичны изменить метод push и также next переменных в Node<E>.

Смежные вопросы