簡體   English   中英

不兼容的類型:java.lang.Object無法轉換為T

[英]incompatible types : java.lang.Object cannot be converted to 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

我不理解此錯誤,我不在代碼中的任何地方使用對象。

當您將Node聲明為

private class Node<T>

您要聲明一個通用類型,其中另一個T作為封閉類型中的T。 您正在隱藏T。因此,簡而言之,就好像您在聲明它為

private class Node<E>

只需使用

private class Node

節點的數據字段不知道其類型。

初始化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。

您聲明Node內的類型,其自身的類型參數,那么TNode陰影TStack ,它們有本質的不同類型。

在您的Node類型中刪除類型參數<T>聲明(這可能就是您的意思)

(對於Java 8)您可以在Diamond運算符中使用類型化變量:

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

否則,將泛型初始化為Object ,因此顯示錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM