Java通过接口实现Consumer多态解决通用弹窗openDialog复用问题
问题解决结论
我最终自行解决了该问题,事实证明Consumer支持类型转换,可通过接口强制所有xxx_dialogs都使用openDialog函数。
基础数据Bean定义
产品、客户对应的数据Bean定义如下:
public class Prod extends MyBean { private String P_NO = ""; private setP_NO(String p_no){ P_NO= p_no; } private String getP_NO(){ return P_NO; } } public class Cust extends MyBean { private String CUST_NO = ""; .... }
视图层调用代码如下:
public class MyView{ TextField textFieldP_NO; Button btnProd; Button btnCust; public MyView (){ //...构造方法... } btnProd.addClickListener(e -> { Prod_Dialog p_dlg = new Prod_Dialog(); //修复前写法 //p_dlg.openDialog(p -> textFieldP_NO.setValue(p.getP_NO())); //修复后写法 p_dlg.openDialog(p -> textFieldP_NO.setValue(((PROD_Dialog.Prod) p).getP_NO())); }); btnCust.addClickListener(e -> { Cust_Dialog c_dlg = new Cust_Dialog(); //修复前写法 //c_dlg.openDialog(c -> textFieldP_NO.setValue(c.getCUST_NO())); //修复后写法 c_dlg.openDialog(c -> textFieldP_NO.setValue(((CUST_Dialog.Cust) c).getCUST_NO())); }); }
接口改造方案
调整参数使Consumer支持多态,改造后的BaseDialog接口代码如下:
public interface BaseDialog { //修复前仅支持产品类型,可扩展性差 //public abstract void openDialog(Consumer<Prod> selectionAction); //修复后支持所有继承MyBean的子类 public abstract void openDialog(Consumer<? extends MyBean> selectionAction); }
弹窗实现逻辑
Prod_Dialog和Cust_Dialog通过clickOk方法传递Consumer<Prod>或Consumer<Cust>类型参数,代码如下:
//修复前 //public class Prod_Dialog { //修复后 public class Prod_Dialog implements BaseDialog{ private Button btnOk; ... //修复前 //public void openDialog(Consumer<Prod> selectionAction) { //修复后 public void openDialog(Consumer<? extends MyBean> selectionAction) { btnOk.addClickListener(e -> { //修复前 // Prod sel_prod = grid.asSingleSelect().getValue(); // String p_no = sel_prod.getP_NO(); //获取用户选中的产品编号 // Prod prod = new Prod(); // prod.setP_NO(p_no); // selectionAction.accept(prod); //修复后核心逻辑,通过Consumer类型转换实现 clickOK((Consumer<Prod>) selectionAction); } } public void clickOK(Consumer<Prod> selectionAction) { Prod sel_prod = grid.asSingleSelect().getValue(); String p_no = sel_prod.getP_NO(); //获取用户选中的产品编号 Prod prod = new Prod(); prod.setP_NO(p_no); selectionAction.accept(prod); } } public class Cust_Dialog implements BaseDialog{ private Button btnOk; ... public void openDialog(Consumer<? extends MyBean> selectionAction) { btnOk.addClickListener(e -> { //修复前 // Cust sel_cust = grid.asSingleSelect().getValue(); // String c_no = sel_cust.getCUST_NO(); //获取用户选中的客户编号 // Cust cust = new Cust(); // cust.setCUST_NO(c_no); // selectionAction.accept(cust); //修复后核心逻辑,通过Consumer类型转换实现 clickOK((Consumer<Cust>) selectionAction); //通过Consumer转换实现功能 } } public void clickOK(Consumer<Cust> selectionAction) { Prod sel_cust = grid.asSingleSelect().getValue(); String c_no = sel_cust.getCUST_NO(); //获取用户选中的客户编号 Cust cust = new Cust(); cust.setCUST_NO(c_no); selectionAction.accept(cust); } }
内容的提问来源于stack exchange,提问作者Air Wei
相关产品推荐
相关产品推荐

