亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何處理通用接口實現并避免@SuppressWarnings?

如何處理通用接口實現并避免@SuppressWarnings?

慕妹3146593 2023-03-23 16:27:42
我正在嘗試對不同的服務實現進行通用處理,但我經常收到“由于原始類型而導致未檢查的調用”錯誤。我嘗試了幾種實現,但不太明白這里的問題是什么。我有以下模型:public abstract class Fruit {  public List<String> vitamins;  public String originCountry;  // getters and setters omitted}具體實現如下:public class Kiwi extends Fruit {}public class Pineapple extends Fruit {}我有以下界面:public interface FruitCheckService<T extends Fruit> {  List<String> compareVitaminsFromDifferentCountries(T firstFruit, T secondFruit);  Class<T> getImplementation();}對于上面給出的 2 個模型的實現:@Servicepublic class KiwiCheckServiceImpl implements FruitCheckService<Kiwi> {  @Override  public List<String> compareVitaminsFromDifferentCountries(Kiwi firstFruit, Kiwi secondFruit) {    // some implementation    return new ArrayList<>();  }  @Override  public Class<Kiwi> getImplementation() {    return Kiwi.class;  }}還有菠蘿:@Servicepublic class PineappleCheckServiceImpl implements FruitCheckService<Pineapple> {  @Override  public List<String> compareVitaminsFromDifferentCountries(Pineapple firstFruit, Pineapple secondFruit) {    // some implementation    return new ArrayList<>();  }  @Override  public Class<Pineapple> getImplementation() {    return Pineapple.class;  }}我有以下類正在使用不同的 bean 進行操作:@Servicepublic class FruitServices {  private Map<Class, FruitCheckService> beansMap;  @Autowired  public FruitServices(List<FruitCheckService> fruitCheckServices) {    beansMap = new HashMap<>();    fruitCheckServices      .forEach(        fruitCheckService -> {          Class implementation = fruitCheckService.getImplementation();          beansMap.put(implementation, fruitCheckService);        }      );  }  public FruitCheckService getFruitCheckService(Class clazz) {    return beansMap.get(clazz);  }}
查看完整描述

1 回答

?
POPMUISE

TA貢獻1765條經驗 獲得超5個贊

問題是您Class在服務定義中使用原始類型。要解決此問題,您可以使用有界通配符類型 ?,如下所示:


class FruitServices {


  private Map<Class<? extends Fruit>, FruitCheckService<? extends Fruit>> beansMap;



  public FruitServices(List<FruitCheckService<? extends Fruit>> fruitCheckServices) {


    beansMap = new HashMap<>();


    fruitCheckServices

      .forEach(

        fruitCheckService -> {

          Class<? extends Fruit> implementation = fruitCheckService.getImplementation();

          beansMap.put(implementation, fruitCheckService);

        }

      );

  }


  public FruitCheckService<? extends Fruit> getFruitCheckService(Class<? extends Fruit> clazz) {

    return beansMap.get(clazz);

  }

}

對于課堂來說,BusinessService事情會變得更加棘手。首先,有必要制定compareVitamins一個通用方法來確保兩個水果屬于同一類型。但即使那樣,我也不相信你可以避免 unchecked cast from the result,getFruitCheckService因為,由于FruitServices必須處理不同類型水果的服務,你不能為 的返回值提供精確的類型參數getFruitCheckService。


class BusinessService {


    private FruitServices fruitServices;


    public <T extends Fruit> void compareVitamins(T one, T two) {


        @SuppressWarnings("unchecked")

        FruitCheckService<T> fruitCheckService = 

            (FruitCheckService<T>) fruitServices.getFruitCheckService(one.getClass());


        List<String> result = fruitCheckService.compareVitaminsFromDifferentCountries(one, two);

    }

}


查看完整回答
反對 回復 2023-03-23
  • 1 回答
  • 0 關注
  • 97 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號