1

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

(请我不想使用任何导入。)

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>sComparable节点,我将无法到达里面的元素。

这是我在 Stack Overflow 上的第一篇文章,希望也能得到很好的回应,我不介意批评。

谢谢。

4

2 回答 2

1

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

List<Node<T>> arrChildren = new LinkedList<>();

更长的解释:

数组:

  • 在运行时跟踪它们的组件类型。
  • 是协变的(an Integer[]is a Number[]is an Object[])。

通用类型:

  • 让编译器删除它们的类型参数,以使它们在运行时不可用。对 a 的Node<String>调用成为对 a的调用,并Node通过适当的强制转换为String
  • 不是协变的( a不是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>向数组添加 a应该会引发运行时异常,但它不会,因为数组只知道它的组件类型是Node,而不是Node<Integer>

有关更多信息,请参阅 Angelika Langer 的泛型常见问题解答:我可以创建其组件类型为具体参数化类型的数组吗?

于 2013-04-12T03:48:18.810 回答
0
Node<T>[] arrChildren = (Node<T>[])new Node<?>[size];
于 2013-04-12T09:37:29.603 回答