![](/img/trans.png)
[英]gradle class cast exception: cannot cast to 'java.lang.iterable'
[英]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.