0

誰かがこのコードのエラーを教えてもらえますか?

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

4 に答える 4

2

型付き配列を作成することはできません。あなたはこれをしなければなりません:

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

そして、配列が型指定されていないという事実に対処します:(

于 2011-02-16T19:34:07.247 に答える
2

子とキーの配列の代わりに、andを使用List<Node<T>>しますList<T>ArrayList実装として)。ArrayListこのようにして、クラス内での配列の作成とキャストの複雑さを隠すことができます。(これもを使用しますが、ジェネリック配列を作成しようとするのではなく、Object[]onおよび同様のメソッドのみを変換します)。get()

または、とにかく一種のマップを作成しているように見えるのでMap<T, Node<T>>、キーとノードにを使用します(ただし、インデックスアクセスはありません)。

于 2011-02-16T19:51:30.913 に答える
1

これを行うことはできません:

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

ここでは、オブジェクト配列を作成していますが、オブジェクトはノードではありません。代わりにノード配列を作成する必要があります。

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

コードでこれと同じエラーが2回発生します。

于 2011-02-16T19:35:24.243 に答える
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];
    }
}
于 2011-02-16T19:32:09.620 に答える