2

我需要获取容器的所有子文本字段,检票口提供了一个名为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);
}

它工作,为什么会发生这种情况?据我所知,这两种方法都应该有效

4

2 回答 2

4

第一个(损坏的)示例等效于:

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

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

棘手的部分是我们没有从这里进行演员Object阵容FormComponent<?>

相反,代码尝试数组Object转换为FormComponent<?>

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

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

(请注意,我们传递的是一个空数组FormComponent<?>

于 2013-03-14T02:13:49.840 回答
0

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

toArray(new FormComponent<?>[0])
于 2013-03-14T01:54:02.257 回答