泛型和数组在Java中根本混合不好。仅使用
List<T>您正在考虑的实现会容易得多:
List<Node<T>> arrChildren = new linkedList<>();
更长的解释:
数组:
- 在运行时跟踪其组件类型。
- 是协变的(a
Integer[]
是aNumber[]
是anObject[]
)。
通用类型:
- 将其类型参数由编译器删除,以使其在运行时不可用。呼叫到并使用适当的强制转换为
Node<String>
呼叫。Node``String
- 不是协变的(一个
List<Integer>
是 不是 一个List<Number>
)。
new Node<T>[size]不允许的原因是因为数组需要在运行时知道其组件类型,这时不再有的概念
T。只
newNode<?>[size]允许类似的东西。
忽略创建一个数组的限制
Node<T>是不安全的,因为可能出现以下情况:
Node<Integer>[] intNodeArray = ...;Object[] objArray = intNodeArray; //legal because arrays are covariantobjArray[0] = new Node<String>("asfd"); //should fail but doesn't...//sometime laterNode<Integer> intNode = intNodeArray[0]; //still doesn't fail because of erasureInteger i = intNode.getValue(); //only now do we get a runtime exception向
Node<String>数组添加a 应该会 引发运行时异常,但这不是因为数组仅知道其组件类型为
Node,而不是
Node<Integer>。
有关更多信息,请参见Angelika
Langer的泛型常见问题解答:是否可以创建其组件类型为具体参数化类型的数组?



