【问题标题】:Converting an ArrayList to separate arguments for a varargs constructor将 ArrayList 转换为 varargs 构造函数的单独参数
【发布时间】:2013-12-20 06:39:38
【问题描述】:

我不确定我想做的是否可行,但我会先解释原因,然后再解释我要做什么。

我正在使用一个用于进化计算的框架,它本质上是从我将要描述的构造函数中生成一个树结构,其中每个节点都可以有可变数量的子节点。

我正在尝试编写一个通用节点构造函数,该构造函数接受可变数量的参数,这些参数用作该节点的子对象(因此节点可以根据此省略号从 1 到子对象)。

如果我要为 2 个孩子手动执行此操作,我将有一个类似以下的函数,其中 super 正在调用为当前节点创建整体结构的父类:

public Wrapper(final SageProgram sp, final Node child1, final Node child2) {
        super(child1, child2);
}

但是,正如我所提到的,我想扩展它,所以我正在尝试以下操作:

public NWrapper(final ArrayList<Node> children) {
        super(children.toArray(new Node[children.size()]));
}

问题是我得到了java.lang.ArrayStoreException,因为构造函数中的变量是数组类型(Node[])而不是单数类型(Node)。

有没有办法解决这个问题?

【问题讨论】:

  • 请提供确切的异常和堆栈跟踪,并标记引发异常的行。是super 电话吗?是在超级构造函数中抛出的吗?其他地方?
  • 这是一个相当复杂的框架,所以我将其抽象为这个问题。如所示,它是一个 ArrayStoreException,基本上是试图将 Node 变量设置为 Node[]。据我了解,问题是通过将数组传递给超级构造函数,我实际上是在传递 Node[] 而不是单独的节点变量。

标签: java oop constructor ellipsis


【解决方案1】:

也许不是:

    public NWrapper(final ArrayList<Node> children) 

您可以将对象分解为Node[] 对象和Node 对象。然后在包装器中处理它们。然后外壳将类似于以下内容:

    public NWrapper(final ArrayList<Node[]> children_lists, final ArrayList<Node> children)

您仍然需要根据需要处理您对超类的调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    相关资源
    最近更新 更多