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

时间:2013-04-11 19:34:40

标签: java arrays generics types tree

我正在尝试实现一个有多个孩子的树,我需要以某种方式存储这些孩子。我决定使用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溢出的第一篇文章我希望得到一个好的回应,我不介意批评。

感谢。

2 个答案:

答案 0 :(得分:1)

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

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

更长的解释:

阵列:

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

通用类型:

  • 编译器使用类型参数erased,使它们在运行时不可用。拨打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];