不兼容的类型:java.lang.Object无法转换为T.

时间:2016-06-16 11:37:17

标签: java generics stack

这是我的代码:

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 个答案:

答案 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,因此会显示错误。