我正在尝试实现一个有多个孩子的树,我需要以某种方式存储这些孩子。我决定使用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
节点,则无法访问其中的元素。
这是我关于Stack溢出的第一篇文章我希望得到一个好的回应,我不介意批评。
感谢。
答案 0 :(得分:1)
泛型和数组在Java中不能很好地混合。像您正在考虑的那样使用List<T>
实现会容易得多:
List<Node<T>> arrChildren = new LinkedList<>();
更长的解释:
阵列:
Integer[]
是Number[]
是Object[]
)。通用类型:
Node<String>
的电话会调用Node
并使用适当的演员阵容发送至String
。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>
应抛出运行时异常,但它不会因为数组只知道其组件类型为Node
而不是{{ 1}}。
有关详细信息,请参阅Angelika Langer的泛型常见问题解答:Can I create an array whose component type is a concrete parameterized type?
答案 1 :(得分:0)
Node<T>[] arrChildren = (Node<T>[])new Node<?>[size];