2016-06-16 212 views
0

这里是我的代码:不兼容的类型:java.lang.Object中无法转换至T

package datastructures; 

import java.util.Iterator; 

public class Stack<T>{ 
    private class Node<T>{ 
     T data; 
     Node next; 
    } 
    private int size; 
    private Node head; 
    private Node newNode(T data){ 
     Node new_node = new Node(); 
     new_node.data = data; 
     new_node.next = null; 
     return new_node; 
    } 
    public Stack(){ 
     size = 0; 
     head = null; 
    } 

    public T pop() { 
     if(head == null) 
      return null; 
     T ret_val = head.data; //Error here 
     head = head.next; 
     this.size--; 
     return ret_val; 
    } 
} 

我得到的pop方法的错误,这里是错误:

Error: incompatible types : java.lang.Object cannot be converted to T 

我不明白这个错误,我没有在我的代码中的任何地方使用Object。

回答

4

在声明节点作为

private class Node<T> 

你在宣告封闭类型的泛型类型与其他T作为吨。你躲在T.因此,简而言之,这是因为如果你是它声明为

private class Node<E> 

只需使用

private class Node 
0

节点的数据字段不知道它的类型。

尝试给出初始化时的类型

private Node<T> head; 
private Node<T> newNode(T data){ 
    Node new_node = new Node<T>(); 
    new_node.data = data; 
    new_node.next = null; 
    return new_node; 
} 

现在,new_node知道该数据字段是类型T的。

0

您声明Node内的类型,其自己的类型参数的Node阴影StackT所以T,它们有本质的不同类型。在Node型类型参数<T>

删除声明(这可能是你的意思吧)

0

(对于Java 8)你可以使用一个类型变量与钻石操作:

private Node newNode(T data) { 
    Node<T> new_node = new Node<>(); 
    new_node.data = data; 
    new_node.next = null; 
    return new_node; 
} 

否则,该仿制品将被初始化为Object,因此会显示错误。

相关问题