如何在FormComponent方法中返回不同组件?解决类型不匹配报错
解决"Type mismatch: cannot convert from ComboCustom to FormComponent<?>"错误
我写了一个criaComponentes方法,用来创建2个TextField和1个ComboCustom组件,但返回组件数组时触发类型不匹配错误:Type mismatch: cannot convert from ComboCustom to FormComponent<?>。两个TextField能正常工作,不清楚ComboCustom出错的原因和解决办法,相关代码如下:
private static FormComponent<?>[] criaComponentes(FiltroListaEquipamentosASerSubstituido2 filtro) { ComboCustom<EqpMarca> marca = new ComboCustom<EqpMarca>("marca", new PropertyModel<EqpMarca>(filtro, "marca"), list, new ChoiceRenderer<EqpMarca>() { private static final long serialVersionUID = 1L; @Override public String getDisplayValue(EqpMarca est) { return est.getDesignacao(); } @Override public String getIdValue(EqpMarca est, int arg) { return String.valueOf(est.getIdMarca()); } }); marca.add(new AjaxFormComponentUpdatingBehavior(HtmlTag.ONCHANGE) { private static final long serialVersionUID = 1L; @Override protected void onUpdate(AjaxRequestTarget target) { target.add(marca); } }); return new FormComponent<?>[] { new TextField<String>("nome", new PropertyModel<String>(filtro, "nome")), marca, new TextField<String>("modelo", new PropertyModel<String>(filtro, "modelo")) }; }
错误原因
这个类型不匹配的核心问题是**ComboCustom类没有继承FormComponent<?>或其子类**:
- Wicket的
TextField属于FormComponent的子类,因此可以直接放入FormComponent<?>[]数组; - 而
ComboCustom如果是自定义组件或第三方组件,其继承链未关联到FormComponent,导致编译器无法完成类型转换。
解决办法
方案1:修改ComboCustom的继承关系(推荐)
如果ComboCustom是你自行实现的组件,让它继承Wicket表单组件的基类:
- 若为单选下拉类组件,继承
AbstractSingleSelectChoice<T>(FormComponent的子类); - 通用场景下直接继承
FormComponent<T>。
示例定义:
public class ComboCustom<T> extends AbstractSingleSelectChoice<T> { // 组件实现代码 }
方案2:调整返回数组的类型(无法修改ComboCustom时使用)
如果不能修改ComboCustom的代码,将方法返回类型改为Component[](所有Wicket组件的顶级父类),这样数组可容纳任意组件类型:
private static Component[] criaComponentes(FiltroListaEquipamentosASerSubstituido2 filtro) { // 原有代码不变... return new Component[] { new TextField<String>("nome", new PropertyModel<String>(filtro, "nome")), marca, new TextField<String>("modelo", new PropertyModel<String>(filtro, "modelo")) }; }
注意:该方式会丢失编译时类型安全,后续使用数组元素时可能需要手动类型转换,需谨慎处理。
内容的提问来源于stack exchange,提问作者Diogo Cruz
相关产品推荐
相关产品推荐

