具有多个子项的树的数组中的generics类型

我正在尝试实现一个有多个孩子的树,我需要以某种方式存储这些孩子。 我决定使用LinkedList但我想先尝试使用数组。

(我不想使用任何import货。)

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

这不起作用。

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

这有效,但我无法将arrChildren[0]与普通的Node ,如果我制作了所有NodeComparable节点,我无法访问其中的元素。

这是我关于Stack溢出的第一篇文章我希望得到一个好的回应,我不介意批评。

谢谢。

generics和数组在Java中不能很好地混合。 像你正在考虑的那样使用List实现会容易得多:

 List> arrChildren = new LinkedList<>(); 

更长的解释:

arrays:

  • 在运行时跟踪其组件类型。
  • 是covariant( Integer[]Number[]Object[] )。

通用类型:

  • 让编译器删除它们的类型参数,使它们在运行时不可用。 对Node调用将成为对具有适当强制转换为StringNode调用。
  • 不是协变的( List 不是 List )。

不允许new Node[size]的原因是因为数组需要在运行时知道它的组件类型,此时不再有T的概念。 只允许new Node[size]类的东西。

忽略创建Node数组的限制,仅仅引用一个是不安全的,因为可能存在以下情况:

 Node[] intNodeArray = ...; Object[] objArray = intNodeArray; //legal because arrays are covariant objArray[0] = new Node("asfd"); //should fail but doesn't ... //sometime later Node intNode = intNodeArray[0]; //still doesn't fail because of erasure Integer i = intNode.getValue(); //only now do we get a runtime exception 

Node添加到数组应该抛出运行时exception,但它不会,因为该数组只知道它的组件类型是Node ,而不是Node

有关更多信息,请参阅Angelika Langer的Generics FAQ: 我可以创建一个组件类型为具体参数化类型的数组吗?

 Node[] arrChildren = (Node[])new Node[size];