![](/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.