有人能告诉我这段代码中的错误是什么吗?
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);
}
}
基本上我想要一个自我引用的东西,一个对象存储一个自己的对象数组。我收到此错误
线程“main”中的异常java.lang.ClassCastException:[Ljava.lang.Object;无法转换为[Tree.Node;
树是我的包名。
答案 0 :(得分:2)
您无法制作类型化数组。你必须这样做:
Node<T>[] children = new Node[degree * 2];
并处理数组是无类型的事实:(
答案 1 :(得分:2)
使用List<Node<T>>
和List<T>
(以及ArrayList
作为实现),而不是您的子项和键的数组。这样,您就可以隐藏ArrayList
类中数组创建和转换的复杂性。 (它也使用Object[]
,但只能转换get()
和类似的方法,而不是尝试使用通用数组。)
或者,因为它看起来你正在创建一种地图,所以使用Map<T, Node<T>>
作为你的密钥和节点(但你没有索引访问权限)。
答案 2 :(得分:1)
你不能这样做:
Node<T>[] children = (Node<T>[])new Object[degree * 2];
这里创建一个Object数组,Object不是Node。您应该创建一个Node数组,即
Node<T>[] children = new Node[degree * 2];
您的代码中有两次同样的错误。
答案 3 :(得分:0)
您无法将对象强制转换为节点:
Node<T>[] children = (Node<T>[])new Object[degree * 2];
你要么以错误的方式思考它:“任何对象可能是一个节点”,唯一真实的是“每个节点都是一个对象”,或者,你习惯于C ++或类似的你可以将void指针强制转换为任何其他指针。
此外,您不能拥有泛型类型数组。例如,你必须创建一个包装器类型。 StringNode extends Node<String>
以便将它们存储在数组中。
例如,这个片段编译得很好:
class Node<T> {
}
class StringNode extends Node<String> {
}
public class Test {
public void method() {
Node<String>[] children = new StringNode[5];
}
}