有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

泛型不兼容的类型: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

我不理解这个错误,我没有在代码中的任何地方使用对象


共 (4) 个答案

  1. # 1 楼答案

    (对于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,因此显示错误

  2. # 2 楼答案

    当您将节点声明为

    private class Node<T>
    

    您正在声明一个泛型类型,并将另一个T作为封闭类型中的T。你在隐藏T。所以,简言之,就好像你在宣布它是

    private class Node<E>
    

    只用

    private class Node
    
  3. # 3 楼答案

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

    尝试在初始化时指定类型

    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;
    }
    

    现在,新节点知道数据字段的类型为T

  4. # 4 楼答案

    您正在使用自己的类型参数声明Node内部类型,因此Node阴影的T阴影的Stack,它们本质上是不同的类型

    Node类型中删除类型参数<T>的声明(这可能就是您的意思)