当前位置: 首页 > 面试题库 >

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

周玺
2023-03-14
问题内容

我正在尝试实现一个有多个孩子的树,并且需要以某种方式存储这些孩子。我决定可以使用a,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>s
Comparable节点都设为“我”,则无法到达其中的元素。

这是我关于堆栈溢出的第一篇文章,我希望也能获得良好的答复,我不介意批评。

谢谢。


问题答案:

泛型和数组在Java中根本混合不好。仅使用List<T>您正在考虑的实现会容易得多:

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

更长的解释:

数组:

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

通用类型:

  • 将其类型参数由编译器删除,以使其在运行时不可用。呼叫到并使用适当的强制转换为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>数组添加a 应该会 引发运行时异常,但这不是因为数组仅知道其组件类型为Node,而不是Node<Integer>

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



 类似资料:
  • 问题是: 创建一个名为Duo的泛型类,它有两个参数a和B。声明一个名为a类型的第一个变量,以及一个名为B类型的第二个变量。创建一个接受这两个参数的构造函数。在构造函数中,将这些参数分别分配给声明的变量。 这是我能想到的解决方案: 然后,当我继续问下一个问题时,我被绊住了。问题是: 使用问题4中的Duo类声明并创建两个对象,如下所示: a) 第一个名为sideShape的对象分别由字符串类型和整数类

  • 问题内容: 我想拥有一个Class对象,但是我想强迫它代表的任何类扩展A类并实现接口B。 我可以: 要么: 但我不能两者都做。有没有办法做到这一点? 问题答案: 实际上,你可以做你想做的事。如果要提供多个接口或一个类加接口,则必须使通配符看起来像这样: 请参见sun.com上的泛型教程,特别是页面底部的“ 绑定类型参数”部分。实际上,如果需要,你可以列出多个接口,并& InterfaceName根

  • 问题内容: 我正在尝试创建一个泛型类型的数组。我收到错误消息: 我很困惑。任何线索为什么会这样。 问题答案: 其背后的原因是,您不能创建通用或参数化类型的数组,而只能 创建可验证的 类型(即可以在运行时推断出的类型)。 尽管可以将此类数组类型 声明 为变量或方法参数。这有点不合逻辑,但这就是Java的样子。 Java泛型和集合在第6章中广泛讨论了此问题和相关问题。

  • 编译以下Java代码: 此外,编译以下代码: 以下代码将给我一个编译错误: 因此,看起来,如果其中一个边界类型本身是类型参数,就不可能有多个边界。但为什么呢? 据我所知,如果声明了多个边界,那么最多一个边界可能是一个类(其他所有边界都是接口),并且它必须是第一个边界。 但是,既然在我的示例中是一个接口,为什么编译器会抱怨呢?毕竟,T是接口还是类应该没有任何区别。 我试图在网上找到答案,但显然我的谷

  • 它是关于java中具有两种泛型类型(一种用于返回类型,另一种用于形式参数)的泛型方法以及如何实现它。我想我在图片中缺少一些东西来让它工作。 事情是这样的... 这是工作 : 这不起作用: java编译器告诉我: 好吧,就是这样。提前感谢大家!希望它能在未来帮助别人! P、 D:这不是枚举类型的问题。它发生在类和层次结构之间。所以别怪Enum了,我试过了,但没用。 对于泛型参数 我们可以做一个一般规

  • 我有一个扩展a的类B。a存储一个Item的列表,B存储一个BItem的列表 在“a”中,我有一个使用[?extends AItem]的ArrayList。 我假设这意味着我可以将这个ArrayList用于扩展aItem的任何类型的对象。