ジェネリックと配列は、Java ではうまく組み合わせられません。List<T>
あなたが考えていたような実装を使用する方がはるかに簡単です:
List<Node<T>> arrChildren = new LinkedList<>();
より長い説明:
配列:
- 実行時にコンポーネント タイプを追跡します。
- 共変です ( an
Integer[]
is a Number[]
is an Object[]
)。
ジェネリック型:
- 実行時に使用できないように、コンパイラによって型引数が消去されます。a への呼び出しは、 への適切なキャストを伴う
Node<String>
a への呼び出しになります。Node
String
- 共変ではありません (a
List<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:コンポーネントの型が具体的なパラメーター化された型である配列を作成できますか? を参照してください。