Java中的类强制转换异常:无法强制转换

时间:2011-02-16 19:30:53

标签: java generics classcastexception

有人能告诉我这段代码中的错误是什么吗?

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;

树是我的包名。

4 个答案:

答案 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];
    }
}