1

複数の子を持つツリーを実装しようとしていますが、これらの子を何らかの形で保存する必要があります。を使用できると判断しましたLinkedListが、最初に配列を使用してみたいと思います。

(インポートは使用したくありません。)

class Node<T extends Comparable<? super T>>
{
    Node<T> arrChildren[] = new Node<T>[size];
}

これは動作しません。

class Node<T extends Comparable<? super T>>
{
    Comparable<Node<T>> arrChildren[] = new Comparable[size];
    T element;
}

arrChildren[0]これは機能しますが、法線と比較することはできず、Node<T>すべてNode<T>Comparableノードを作成すると、内部の要素に到達できません。

これはスタック オーバーフローに関する私の最初の投稿です。私も良い反応を得られることを願っています。批判は気にしません。

ありがとう。

4

2 に答える 2

1

ジェネリックと配列は、Java ではうまく組み合わせられません。List<T>あなたが考えていたような実装を使用する方がはるかに簡単です:

List<Node<T>> arrChildren = new LinkedList<>();

より長い説明:

配列:

  • 実行時にコンポーネント タイプを追跡します。
  • 共変です ( an Integer[]is a Number[]is an Object[])。

ジェネリック型:

  • 実行時に使用できないように、コンパイラによって型引数が消去されます。a への呼び出しは、 への適切なキャストを伴うNode<String>a への呼び出しになります。NodeString
  • 共変ではありません (aList<Integer>はaではありませんList<Number>)。

許可されない理由new Node<T>[size]は、配列が実行時にそのコンポーネントの型を知る必要があるためですT。のようなものだけnew Node<?>[size]が許されます。

の配列を作成する際の制限を無視してNode<T>、次のシナリオが考えられるため、単純に配列への参照を持つことは安全ではありません。

Node<Integer>[] intNodeArray = ...;
Object[] objArray = intNodeArray; //legal because arrays are covariant
objArray[0] = new Node<String>("asfd"); //should fail but doesn't

...

//sometime later
Node<Integer> intNode = intNodeArray[0]; //still doesn't fail because of erasure
Integer i = intNode.getValue(); //only now do we get a runtime exception

Node<String>配列に a を追加すると実行時例外がスローされるはずですが、配列はそのコンポーネントの型がNodeではなく であることしか認識していないため、実行時例外はスローされませんNode<Integer>

詳細については、Angelika Langer の Generics FAQ:コンポーネントの型が具体的なパラメーター化された型である配列を作成できますか? を参照してください。

于 2013-04-12T03:48:18.810 に答える
0
Node<T>[] arrChildren = (Node<T>[])new Node<?>[size];
于 2013-04-12T09:37:29.603 に答える