Best practice when returning a wildcard List in java -


i have 2 functions both return lists of similar database beans (they both implement same interface, dbmodel). need filter these lists in same way. relatively new wildcards , wondering if correct approach. help/alternative methods appreciated.

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; } 

don't return wildcard type: use constrained type variable:

private <t extends dbmodel> list<t> summaryfilter(list<t> statlinelist) {   return statlinelist; } 

the advantage of can continue use result list<subclassofdbmodel>: if return list<? extends dbmodel>, can't things adding or setting items.


i encourage read effective java 2nd ed item 28, "use bounded wildcards increase api flexibility", advises use of bounded wildcards in parameters, not in return values.

to make parameter more flexible, can use:

list<? extends t> statlinelist 

as parameter; lets like:

list<pitchingstatsdb> unfiltered = ... list<dbmodel> filtered = summaryfilter(unfiltered); 

which couldn't code @ top, since list<pitchingstatsdb> isn't subclass of list<dbmodel>. it's little bit more complication, little more flexibility; leave judge whether worth code.


Comments