下面泛型方法定義中,會有啥問題嗎?主要是 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 回答

慕的地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);
}

呼啦一陣風
TA貢獻1802條經驗 獲得超6個贊
并不建議這么做,因為這失去了繼承的意義。沒有獲得繼承帶來的好處,卻要背負維護繼承關系的負擔。這買賣不劃算啊,是不?
可以考慮這么做:
-
增加一個
AnimalDAO
:public class AnimalDAO<T extends Animal> { public void insert(List<T> animals) { System.out.println("Animals have been inserted."); } }
-
調用的客戶端:
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
-
添加回答
舉報
0/150
提交
取消