簡體   English   中英

Java中的類強制轉換異常:無法強制轉換

[英]Class Cast Exception in Java: cannot be cast

誰能告訴我這段代碼是什么錯誤?

public class Node<T> {
    private int degree;
    @SuppressWarnings("unchecked")
    T[] keys ;
    Node<T>[] children;
    Node(int degree) {
        System.out.println(degree);
        this.degree = degree;
        @SuppressWarnings("unchecked")
        Node<T>[] children = (Node<T>[])new Object[degree * 2];
        @SuppressWarnings("unchecked")
        T[] keys       = (T[])new Object[(degree * 2) - 1];
     }

     public static void main(String[] s) {
        Node<Integer> a = new Node<Integer>(5);
     }
}

基本上,我想要一種自引用類型的事物,即一個對象存儲自己的對象數組。 我收到此錯誤

線程“主”中的異常java.lang.ClassCastException:[Ljava.lang.Object; 無法轉換為[Tree.Node;

樹是我的包裹名稱。

您不能創建類型數組。 您必須這樣做:

Node<T>[] children = new Node[degree * 2];

並處理數組未類型化的事實:(

代替用於您的子代和鍵的數組,請使用List<Node<T>>List<T> (以及ArrayList作為實現)。 這樣,您就可以隱藏在ArrayList類內部創建和轉換數組的復雜性。 (它也使用Object[] ,但僅在get()和類似方法上進行轉換,而不是嘗試使用通用數組)。

或者,因為看起來您無論如何都在創建某種地圖,所以請對鍵和節點使用Map<T, Node<T>> (但是,此時您沒有索引訪問權限)。

你不可以做這個:

Node<T>[] children = (Node<T>[])new Object[degree * 2];

在這里,您正在創建對象數組,而對象不是節點。 您應該創建一個Node數組,即

Node<T>[] children = new Node[degree * 2];

您的代碼中有兩次相同的錯誤。

您不能將對象投射到節點:

Node<T>[] children = (Node<T>[])new Object[degree * 2];

您可能會以錯誤的方式思考:當唯一正確的事情是“每個節點都是對象”時,“任何對象都可能是節點”,或者您習慣使用C ++或類似的方法進行轉換指向任何其他指針的空指針。

此外, 不能有泛型類型的數組 例如,您必須創建一個包裝器類型。 StringNode extends Node<String>以便將它們存儲在數組中。

例如,以下代碼片段可以正常編譯:

class Node<T> {
}

class StringNode extends Node<String> {
}

public class Test {
    public void method() {
        Node<String>[] children = new StringNode[5];
    }
}

暫無
暫無

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

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