具有多个子项的树的数组中的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
,如果我制作了所有Node
的Comparable
节点,我无法访问其中的元素。
这是我关于Stack溢出的第一篇文章我希望得到一个好的回应,我不介意批评。
谢谢。
generics和数组在Java中不能很好地混合。 像你正在考虑的那样使用List
实现会容易得多:
List> arrChildren = new LinkedList<>();
更长的解释:
arrays:
- 在运行时跟踪其组件类型。
- 是covariant(
Integer[]
是Number[]
是Object[]
)。
通用类型:
- 让编译器删除它们的类型参数,使它们在运行时不可用。 对
Node
调用将成为对具有适当强制转换为String
的Node
调用。 - 不是协变的(
List
不是List
)。
不允许new Node
的原因是因为数组需要在运行时知道它的组件类型,此时不再有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];