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


它起作用了,为什么会这样呢?据我所见,两种方法都应该起作用

最佳答案

第一个(中断)示例等效于:

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


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

棘手的是,我们不在这里执行从ObjectFormComponent<?>的转换。

而是,代码尝试将Object的数组强制转换为FormComponent<?>的数组

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

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


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

09-25 21:37