我正在尝试实现一棵具有多个子项的树,并且我需要以某种方式存储这些子项。我决定我可以使用 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 Overflow 上的第一篇文章,我希望也能得到良好的回应,我不介意批评。
谢谢。
最佳答案
泛型和数组在 Java 中不能很好地混合。只需使用 List<T>
就会容易得多像您正在考虑的实现:
List<Node<T>> arrChildren = new LinkedList<>();
更长的解释:
数组:
- 在运行时跟踪其组件类型。
- 是协变的(
Integer[]
是Number[]
是Object[]
)。
通用类型:
- 有它们的类型参数 erased由编译器处理,使得它们在运行时不可用。调用
Node<String>
成为调用Node
通过适当的转换到String
. - 不是协变的(
List<Integer>
不是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
,不是Node<Integer>
.
有关更多信息,请参阅 Angelika Langer 的泛型常见问题解答:Can I create an array whose component type is a concrete parameterized type?
关于java - 具有多个子项的树的数组中的通用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15957325/