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>,因此可以作为同一列表的元素返回。使用时的注意点:
- 无界通配符
?会让编译器无法确定列表元素的具体类型参数,后续取出元素调用依赖第一个类型参数的方法时,可能需要额外的类型检查或强制转换。 - 如果
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); } } - 你给出的期望代码缺少方法末尾的闭合
},完整可运行的代码需要补上该符号。
- 无界通配符
内容的提问来源于stack exchange,提问作者JulianC
相关产品推荐
相关产品推荐

