这是我的代码:
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。
答案 0 :(得分:5)
将Node声明为
时private class Node<T>
你声明一个泛型类型,另一个T作为封闭类型中的T.你隐藏了T.所以,简而言之,就好像你宣称它是
private class Node<E>
只需使用
private class Node
答案 1 :(得分:0)
节点的数据字段并不知道它的类型。
初始化 head 时尝试提供类型。
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 。
答案 2 :(得分:0)
您要使用自己的类型参数声明Node
内部类型,T
Node
T
Stack
个<T>
,它们本质上是不同的类型
删除Node
类型中类型参数selectAll
的声明(这可能是你的意思)
答案 3 :(得分: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
,因此会显示错误。