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

Java方法能否返回不同泛型类型?代码改造咨询

问题:方法能否返回不同泛型类型的列表?

我有如下方法:

private List<AssignmentInvoker<DigitalInsertionOrderTableRow, String>> getColumns(String campaignDTOenum) {
    if (campaignDTOenum.equals("PRINT")){                
            return List.of(DigitalInsertionOrderTableRow::setNumberOfMonths);
    }
    else return List.of(DigitalInsertionOrderTableRow::setPlannedUnits);
}

我需要将其中的DigitalInsertionOrderTableRow::setNumberOfMonths替换为PrintInsertionOrderTableRow::setNumberOfMonths(该方法属于不同类)。请问能否让一个方法返回不同类型?我期望改造后的方法如下:

private List<AssignmentInvoker<?, String>> getColumns(String campaignDTOenum) {
if (campaignDTOenum.equals("PRINT")){                
        return List.of(PrintInsertionOrderTableRow::setNumberOfMonths);
}
else return List.of(DigitalInsertionOrderTableRow::setPlannedUnits);
}

回答

这种写法是完全可行的,核心原因是Java泛型的通配符?支持这类多类型兼容场景:

  • 通配符的适配逻辑:PrintInsertionOrderTableRow::setNumberOfMonths会被编译器推断为AssignmentInvoker<PrintInsertionOrderTableRow, String>类型,DigitalInsertionOrderTableRow::setPlannedUnits则对应AssignmentInvoker<DigitalInsertionOrderTableRow, String>类型,这两个类型都能向上兼容AssignmentInvoker<?, String>,因此可以作为同一列表的元素返回。

  • 使用时的注意点:

    1. 无界通配符?会让编译器无法确定列表元素的具体类型参数,后续取出元素调用依赖第一个类型参数的方法时,可能需要额外的类型检查或强制转换。
    2. 如果PrintInsertionOrderTableRow和DigitalInsertionOrderTableRow有共同的父类或接口(比如BaseInsertionOrderTableRow),建议改用有界通配符让代码更严谨:
      private List<AssignmentInvoker<? extends BaseInsertionOrderTableRow, String>> getColumns(String campaignDTOenum) {
          if (campaignDTOenum.equals("PRINT")) {                
              return List.of(PrintInsertionOrderTableRow::setNumberOfMonths);
          } else {
              return List.of(DigitalInsertionOrderTableRow::setPlannedUnits);
          }
      }
      
    3. 你给出的期望代码缺少方法末尾的闭合},完整可运行的代码需要补上该符号。

内容的提问来源于stack exchange,提问作者JulianC

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 06:01:13