簡體   English   中英

避免“未選中的呼叫”警告

[英]Avoiding 'Unchecked Call' warning

說我有一個帶有方法getTransformer(Item item)的工廠接口Item是一個接口。 工廠使用instanceOf為項目到實體找到正確的轉換器。 變壓器實現方法S transform(T item)

調用工廠來獲取轉換器是可以的,但是在IDE中突出顯示了調用transformer.transform是未經檢查的對transform(T)調用。 如何避免這種情況?

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

順便說一句,這是為即時采訪而寫的,我明天要去采訪。 我想知道這是否可以解決,或者只是使用未選中的注釋來避免編譯器警告。

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

dtoTransformer沒有類型參數,因此具有原始類型。

您需要在工廠中添加一些類型參數:

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

然后:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM