java - 具有多个子项的树的数组中的通用类型

标签 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 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/

相关文章:

C++动态数组,增加容量

javascript - 数组中最接近的值

c# - IsOrderedBy 扩展方法

java - 'U extends Something' VS 有界类型参数中的 'Something'

java - 使用 simple-odf 优化 ods 文件的写入

java - 使用 JPA 没有列表/集合的 ManyToOne 关系

php - 从 stdClass 对象中提取值

java - 如何对齐 JavaFX TabPane 中的选项卡?

java - 如何在谷歌服务插件更新后删除警告 "WARNING: API ' variant.getMergeResources( )' is obsolete"?

java - 在三元中使用无界泛化静态函数时如何避免未经检查的强制转换?