2017-10-25 1 views
0

Angenommen, ich habe eine Factory-Schnittstelle mit der Methode getTransformer(Item item) Item ist eine Schnittstelle. Factory verwendet instanceOf, um den richtigen Transformator für Item to Entity zu finden. Der Transformer implementiert die Methode S transform(T item).Vermeiden von "Ungeprüfter Anruf" Warnung

Anruf an die Fabrik, um Transformator zu bekommen ist in Ordnung, aber Anruf transformer.transform wird in der IDE als ungeprüfter Anruf zu transform(T) hervorgehoben. Wie vermeide ich das? heißt

DTOTransformer dtoTransformer = dtoTransformerFactory.getTransformer(item); 
ItemEntity itemEntity = dtoTransformer.transform(item); // this line has error 

BTW, dies wurde für ein Interview im Fluge geschrieben, die ich morgen haben werden. Ich würde gerne wissen, ob dies behoben werden kann oder verwende einfach die Anmerkung deaktiviert, um Compiler-Warnungen zu vermeiden.

public interface DTOTransformer<S extends ItemEntity, T extends Item> { 

    S transform(T item); 
} 

public interface DTOTransformerFactory { 

    DTOTransformer getTransformer(Item item); 
} 

public class DTOTransformerFactoryImpl implements DTOTransformerFactory { 
    @Override 
    public DTOTransformer getTransformer(Item item) { 
     if (item instanceof RegularItemDTO) { 
      return new RegularDTOTransformer(); 
     } else if (item instanceof SpecialItemDTO) { 
      return new SpecialDTOTransformer(); 
     } else { 
      throw new IllegalArgumentException("No transformer for type:  " + item.getClass()); 
     } 
    } 
} 

public class SpecialDTOTransformer implements  DTOTransformer<SpecialItemEntity, SpecialItemDTO> { 
    @Override 
    public SpecialItemEntity transform(SpecialItemDTO item) { 
     SpecialItemEntity specialItemEntity = new SpecialItemEntity(); 
     specialItemEntity.setPrice(item.getPrice()); 
     specialItemEntity.setSku(item.getSku()); 
     specialItemEntity.setItem(item.getItem()); 
     specialItemEntity.setBuyAmount(item.getBuyAmount()); 
     specialItemEntity.setDiscountPrice(item.getDiscountPrice()); 

     return specialItemEntity; 
    } 
} 
+2

„diese Linie hat Fehler“ Diese Linie ist nicht in dem Code, den Sie geschrieben haben. –

+0

'DTOTranformer' ist ein Rohtyp. – shmosel

+0

Es ist schwer zu sagen, was das Problem ist, weil Sie über Code sprechen, den Sie nicht zeigen ... aber rohe Typen zu verwenden wird Teil des Problems sein. –

Antwort

0

dtoTransformer hat keine Typargumente, so hat es eine rohe Art.

Sie müssen ein paar Typen Argumente zu Ihrem Werk hinzuzufügen:

public interface DTOTransformerFactory { 
    DTOTransformer<?, Item> getTransformer(Item item); 
       // ^-------^ Here 
} 

public class DTOTransformerFactoryImpl implements DTOTransformerFactory { 
    @Override 
    public DTOTransformer<?, Item> getTransformer(Item item) { 
         // ^-------^ Here 
     if (item instanceof RegularItemDTO) { 
      return new RegularDTOTransformer<>(); 
             // ^^ Here, assuming RegularDTOTransformer is similarly parametrized. 
     } else if (item instanceof SpecialItemDTO) { 
      return new SpecialDTOTransformer<>(); 
             // ^^ Here. 
     } else { 
      throw new IllegalArgumentException("No transformer for type:  " + item.getClass()); 
     } 
    } 
} 

Dann:

DTOTransformer<?, Item> dtoTransformer = dtoTransformerFactory.getTransformer(item); 
ItemEntity itemEntity = dtoTransformer.transform(item); // this line has error 
Verwandte Themen