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

Java错误:新的通用TreeNode数组

太叔志文
2023-03-14
问题内容

我有TreeNode的通用类:

public class TreeNode<E> {
public E key;
public int num_of_children;
public TreeNode<E> [] children;


public TreeNode(int num_of_children)
{
    this.num_of_children = num_of_children;
    children = new TreeNode[num_of_children];// Why not: new TreeNode<E>[num_of_children]?
}

public TreeNode<E> clone()
{
    TreeNode<E> node = new TreeNode<E>(num_of_children);
    return node;
}

}

当我尝试做时:children = new TreeNode<E> [num_of_children];

我出错了。但是“ new TreeNode
[num_of_children]”有效。我读了有关类型擦除的文章,但我不明白为什么TreeNode<E>[]它不起作用。这是为什么?请赐教!


问题答案:

之类的东西new TreeNode<String>[],并new TreeNode<E>[]通过Java是不允许的。您唯一可以做的就是new TreeNode[]new TreeNode<?>[](无界通配符参数)。

这样做的原因有些复杂,但很有启发性。Java中的数组在运行时知道它们的组件类型,并且每次您放入某些东西时,它都会检查它是否是组件类型的实例,如果不是,则会引发异常(这与数组类型如何协变有关,因此本质上在编译时是不安全的)。

Object[] foo = new Integer[5];
foo[2] = "bar"; // compiles fine, but throws ArrayStoreException at runtime

现在添加泛型。泛型组件类型的问题在于,由于从运行时类型中删除了泛型,因此TreeNode<Integer>在运行时(与相对TreeNode<String>),您无法检查对象是否是say的实例。它只能检查TreeNode,而不能检查组件类型。但是程序员可能已经期望数组中的这种检查和异常抛出行为,因为它可以正常工作。因此,为避免这种意外失败,Java禁止这样做。(在大多数代码中,无论如何您都不会遇到这个问题,因为您不会混合使用相同类型但类型参数不同的对象。但是从理论上讲是有可能的。)

当然,您可以通过以下方法解决此问题:创建原始或通配符参数类型的html" target="_blank">数组,然后强制转换为适当的类型,例如(TreeNode<Integer>)new TreeNode[5]。有什么不同?好吧,这是未经检查的强制转换,它会生成警告,而您(程序员)应对以后可能发生的所有不安全事件负责。如果它执行了某些意外操作,则编译器会说:“我们告诉您了!”。



 类似资料:
  • 问题内容: 我正在尝试做这样的事情: myObject是一个类。我收到此错误:-通用数组创建(箭头指向new。) 问题答案: 你不能有泛型类的数组。Java根本不支持它。 你应该考虑使用集合而不是数组。例如, 另一个“解决方法”是创建这样的辅助类 然后创建一个数组MyObjectArrayList。 这是一篇很好的文章,说明了为什么在语言中不允许这样做。本文提供了以下示例,说明如果允许的话可能发生

  • 问题内容: 嗨,我正在尝试创建一组六边形集(六边形是我创建的类)。 但是当我尝试编译时出现此错误 我该如何解决? 问题答案: 您不能使用泛型创建数组。使用或代替。 这是正式的解释。

  • 问题内容: int[][][] inputs; 这是我程序的摘录,我不知道为什么会导致错误。这不正确吗? 提前致谢 :-) 问题答案: 在Eclipse中,我得到了一个非常清晰的错误消息: 提供数组初始值设定项时,无法定义维表达式。 这意味着,可以 任一 指定的尺寸 或 数组初始化(即,值)。您 不能同时 指定两者。 只需将您的最后一行更改为

  • 问题内容: 我们要输入的值怎么 可能来自不同类型? 问题答案: 问题在于,编译器仅知道键类型为“未知”,但不知道映射键的类型和返回的类型是 相同的 未知类型(即使我们作为人类意识到这是相同的) 。 如果要使其工作,则必须通过 键入 方法来告诉编译器 相同的 未知类型,例如: __

  • 我试过后台服务这样的代码,但第一次报警后应用程序崩溃了。并给出了这个错误: Android.app.remoteserviceException:StartForeground的错误通知:java.lang.runtimeException:服务通知的无效通道:通知(通道=null pri=0 contentview=null dibrate=null sound=null defaults=0x

  • 问题内容: 错误代码1603。Java更新未完成。我有一个Java错误 我认为这是服务器问题,这是我第一次创建服务器且用户界面未打开。 问题答案: 从https://java.com/en/download/help/error_1603.xml 选项1:重新启动系统并卸载旧版本 在安装之前重新启动系统 一旦看到1603错误,请重新启动系统。 下载并安装脱机安装程序包。 出现提示时,在下载对话框中