我有两个函数都返回类似数据库bean的列表(它们都实现了相同的接口,DbModel)。我需要以完全相同的方式过滤这些列表。我对通配符比较新,并且想知道这是否是正确的方法。任何帮助/替代方法都将非常感激。
public PlayerStats<HittingStatsDb> getHittingSummaryStats(Integer playerId) {
HittingStatsDbExample example = new HittingStatsDbExample();
example.createCriteria().andPlayerIdEqualTo(playerId).andSplitKeyEqualTo(Constants.SplitKeys.REGULAR_SEASON);
example.setOrderByClause("YEAR DESC");
List<HittingStatsDb> dbList = (List<HittingStatsDb>) summaryFilter(hittingStatsDao.select(example));
List<PlayerStatLine<HittingStatsDb>> statLineList = ListHelper.map(dbList, (statDb) -> new PlayerStatLine<HittingStatsDb>(statDb));
return new PlayerStats<HittingStatsDb>(statLineList);
}
public PlayerStats<PitchingStatsDb> getPitchingSummaryStats(Integer playerId) {
PitchingStatsDbExample example = new PitchingStatsDbExample();
example.createCriteria().andPlayerIdEqualTo(playerId).andSplitKeyEqualTo(Constants.SplitKeys.REGULAR_SEASON);
example.setOrderByClause("YEAR DESC");
List<PitchingStatsDb> dbList = (List<PitchingStatsDb>) summaryFilter(pitchingStatsDao.select(example));
List<PlayerStatLine<PitchingStatsDb>> statLineList = ListHelper.map(dbList, (statDb) -> new PlayerStatLine<PitchingStatsDb>(statDb));
return new PlayerStats<PitchingStatsDb>(statLineList);
}
private List<? extends DbModel> summaryFilter(List<? extends DbModel> statLineList) {
// Filter Logic
return statLineList;
}
答案 0 :(得分:1)
不返回通配符类型:使用约束类型变量:
private <T extends DbModel> List<T> summaryFilter(List<T> statLineList) {
return statLineList;
}
这样做的好处是,您可以继续将结果用作List<SubclassOfDbModel>
:如果您返回List<? extends DbModel>
,则无法执行添加或设置项目等操作。
我建议您阅读 Effective Java 2nd Ed 第28项“使用有界通配符来提高API灵活性”,建议在参数中使用有界通配符,但不能返回值。
要使参数更灵活,您可以使用:
List<? extends T> statLineList
作为参数;这只是让你做的事情:
List<PitchingStatsDb> unfiltered = ...
List<DbModel> filtered = summaryFilter(unfiltered);
您无法使用顶部的代码,因为List<PitchingStatsDb>
不是List<DbModel>
的子类。它更复杂一点,更灵活一点;我告诉你,判断这段代码是否值得。