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

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

Java中的泛型轉換

Java中的泛型轉換

MYYA 2019-02-28 05:14:20
下面泛型方法定義中,會有啥問題嗎?主要是 1 和 3 那樣強制轉換有問題嗎?當然 Cat 和 Dog 是 extends 了 Animal 類 <T extends Animal> void operate(List<T> animalList, Class<T> c){ ... if(c.equals(Cat.class)){ List catList = (List<Cat>) animalList; //1 catDao.insert(catList); //2 } if(c.equals(Dog.class)){ List<Dog> dogList = (List<Dog>) animalList; //3 dogDao.insert(dogList); //4 } ... } 其中 insert()函數定義為: catDao.insert(List<Cat> catList); dogDao.insert(List<Dog> dogList);
查看完整描述

3 回答

?
叮當貓咪

TA貢獻1776條經驗 獲得超12個贊

這個轉換沒什么問題,但總給人一種壞味道的感覺。建議使用工廠模式,這樣判斷就與操作解耦出來了。

查看完整回答
反對 回復 2019-03-01
?
慕的地6264312

TA貢獻1817條經驗 獲得超6個贊

你看能不能這么寫呢?盡管邏輯和你原來的代碼有所不同,但可以達到同樣的目的。

void operate(List<? extends Animal> animalList) {
    List<Cat> catList = new ArrayList<>();
    List<Cat> dogList = new ArrayList<>();
    for (Animal animal : animalList) {
       if (animal instanceof Cat) {
           catList.add((Cat) animal);
       }
       if (animal instanceof Dog) {
           dogList.add((Dog) animal);
       }
    }
    catDao.insert(catList);
    dogDao.insert(dogList);
}
查看完整回答
反對 回復 2019-03-01
?
呼啦一陣風

TA貢獻1802條經驗 獲得超6個贊

并不建議這么做,因為這失去了繼承的意義。沒有獲得繼承帶來的好處,卻要背負維護繼承關系的負擔。這買賣不劃算啊,是不?
可以考慮這么做:

  1. 增加一個AnimalDAO:

    public class AnimalDAO<T extends Animal> {
        public void insert(List<T> animals) {
            System.out.println("Animals have been inserted.");
        }
    }
  2. 調用的客戶端:

    public class AnimalClient {
        public static void main(String[] args) {
            List<Cat> cats = Stream.of(new Cat()).collect(Collectors.toList());
            List<Dog> dogs = Stream.of(new Dog()).collect(Collectors.toList());
            
            operate(cats);
            operate(dogs);
        }
        
        public static <T extends Animal> void operate(List<T> animals) {
            AnimalDAO<T> animalDAO = new AnimalDAO<>();
            animalDAO.insert(animals);
        }
    }
    • 編譯通過,運行結果:

      Animals have been inserted
      Animals have been inserted
查看完整回答
反對 回復 2019-03-01
  • 3 回答
  • 0 關注
  • 1047 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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