我需要获取容器的所有子文本字段,检票口提供一种称为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<?>[])
,这是非法操作。棘手的是,我们不在这里执行从
Object
到FormComponent<?>
的转换。而是,代码尝试将
Object
的数组强制转换为FormComponent<?>
的数组为了解决此问题,请尝试使用替代的
toArray
方法,该方法将所需返回类型的对象作为参数:FormComponent<?>[] array = list.toArray(new FormComponent<?>[0])
(请注意,我们传递的是
FormComponent<?>
的空数组)