【问题标题】:Cast between arrays在数组之间转换
【发布时间】:2013-03-14 01:39:07
【问题描述】:

我需要获取容器的所有子文本字段,检票口提供了一个名为visitChildren的方法

然后我会做类似的事情:

(FormComponent<?>[]) visitChildren(TextField.class).toList().toArray();

这个例子不起作用,我得到的异常是:

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Lorg.apache.wicket.markup.html.form.FormComponent;

但如果我这样做:

List<Component> list = visitChildren(TextField.class).toList();
FormComponent<?>[] array = new FormComponent[list.size()];
for (int x = 0; x < list.size(); x++) {
    array[x] = (FormComponent<?>) list.get(x);
}

它有效,为什么会这样?据我所知,这两种方法都应该有效

【问题讨论】:

  • 下面的方法是最简单的方法,this answer should 告诉你为什么它不起作用。

标签: java casting wicket


【解决方案1】:

第一个(坏掉的)例子等价于:

List<Component> list = visitChildren(TextField.class).toList();
FormComponent<?>[] array = (FormComponent<?>[]) list.toArray();

根据toArray() 的Javadoc,返回类型是Object[],但您试图将其强制转换为(FormComponent&lt;?&gt;[]),这是非法操作。

棘手的部分是我们没有在这里执行从ObjectFormComponent&lt;?&gt; 的转换。

相反,代码尝试将Object数组 转换为FormComponent&lt;?&gt;数组

为了解决这个问题,请尝试使用替代的toArray 方法,该方法将所需返回类型的对象作为参数:

FormComponent<?>[] array = list.toArray(new FormComponent<?>[0])

(请注意,我们传递的是一个空数组 FormComponent&lt;?&gt;

【讨论】:

    【解决方案2】:

    试试这个代码作为解决方案:

    toArray(new FormComponent<?>[0])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-30
      • 2018-05-17
      • 1970-01-01
      • 2019-10-07
      • 2016-11-16
      • 1970-01-01
      • 2021-01-03
      • 1970-01-01
      相关资源
      最近更新 更多