Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use generics for the same method with different input

Tags:

java

private Set<String> extractOfferKeysForAbstractOffers(List<AbstractOfferDto> selectedOffers) {
        Set<String> offerKeys = new HashSet<String>();
        for (AbstractOfferDto offer : selectedOffers) {
            offerKeys.add(offer.getOfferKey());
        }
        return offerKeys;
    }

 private Set<String> extractOfferKeysForOffers(List<OfferDto> selectedOffers) {
        Set<String> offerKeys = new HashSet<String>();
        for (OfferDto offer : selectedOffers) {
            offerKeys.add(offer.getOfferKey());
        }
        return offerKeys;
    }

Instead of using almost the same method just input is different I want to use generics. I create it like this.

private <T> Set<String> extractOfferKeysForOffers(List<T> offers) {
        Set<String> offerKeys = new HashSet<String>();
        for (T offer : offers) {
            offerKeys.add(offer.getOfferKey());
        }
        return offerKeys;
    }

but problem is that offer.getOfferKey() is not recognized. Only options for offer are AbstractOfferDto or OfferDto.

How can I use generics for this example?

like image 240
senzacionale Avatar asked Dec 03 '25 17:12

senzacionale


2 Answers

Tell the compiler about the abstract type:

private <T extends AbstractOfferDto> Set<String> extractOfferKeysForOffers(List<T> offers) {
        Set<String> offerKeys = new HashSet<String>();
        for (T offer : offers) {
            offerKeys.add(offer.getOfferKey());
        }
        return offerKeys;
    }
like image 121
wrm Avatar answered Dec 06 '25 07:12

wrm


Yes you can:

  public interface IOffer {
     String getOfferKey();
  }

  public class OfferDto implements IOffer { ... }

  public class AbstractOfferDto implements IOffer { ... }

  class X {    
    private <T extends IOffer> Set<String> extractOfferKeysForOffers(List<T> offers) {
        Set<String> offerKeys = new HashSet<String>();
        for (T offer : offers) {
            offerKeys.add(offer.getOfferKey());
        }
        return offerKeys;
    }
  }

The above is a general solution. If OfferDto extends AbstractOfferDto, the extra interface is not needed:

  class X {    
    private <T extends AbstractOfferDto> Set<String> extractOfferKeysForOffers(List<T> offers) {
        Set<String> offerKeys = new HashSet<String>();
        for (T offer : offers) {
            offerKeys.add(offer.getOfferKey());
        }
        return offerKeys;
    }
  }
like image 23
NPE Avatar answered Dec 06 '25 08:12

NPE