You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 12:54:05