java數組、泛型、集合在多態中的使用及對比,java多態
我們在使用數組,泛型集合的過程中不可避免的會碰到多態,或者說什麼情況下能如何使用父數組引用子數組(集合、泛型)呢?
數組在多態中的使用
元素為父類型的數組引用可指向元素為子類型的數組對象
當數組被調用時由當前引用確定數組元素的類型
當元素為父類型的數組引用指向了元素為子類型的數組對象時,不可通過父類型的數組引用向集合加入除子類型及其下層級的之外的元素(可通過編譯,運行過程出錯)
1 /*驗證: 2 *animals和dogs可以引用同一個數組 3 *當animals引用數組時,數組元素為Animal類型 4 *當dogs引用數組時,數組元素為Dog類型 5 */ 6 7 public class Animal{ 8 private void showClass(){ 9 System.out.println("數組元素為Animal類型");10 }11 12 public static void main(String[] args){13 //animals和dogs可以引用同一個數組14 Dog[] dogs = {new Dog(), new Dog()};15 Animal[] animals = dogs;16 17 //當animals引用數組時,數組元素為Animal類型18 animals[0].showClass(); 19 //當dogs引用數組時,數組元素為Dog類型20 dogs[0].showClass();21 //不可通過父類型的數組引用向集合加入除子類型及其下層級的之外的元素(可通過編譯,運行過程出錯)22 animals[0] = new Animal(); 23 }24 25 }26 27 class Dog extends Animal{28 public void showClass(){29 System.out.println("數組元素為Dog類型");30 }31 }
泛型在多態中的使用
ArrayList<父類型>無法引用ArrayList<子類型>
1 /*驗證: 2 *animals無法引用dogs數組 3 * 4 */ 5 import java.util.*; 6 7 public class Animal{ 8 9 public static void main(String[] args){10 //animals無法引用dogs數組11 ArrayList<Dog> dogs = new ArrayList<Dog>(); 12 ArrayList<Animal> animals = dogs; /* 無法通過編譯 */13 }14 15 }16 17 18 class Dog extends Animal{19 20 }
為了彌補泛型的缺陷,java引入了一種“萬用字元”——ArrayList<? extends object>
此類型集合可引用任何參數上繼承、實現了參數類型(包括參數類型本身)的集合
1 /*萬用字元 2 *animals可以引用dogs集合 3 *當animals引用集合時,集合元素為Dog類型 4 *當dogs引用集合時,集合元素為Dog類型 5 *無法通過animals對集合進行修改 6 */ 7 import java.util.*; 8 9 public class Animal{10 public void showClass(){11 System.out.println("集合元素為Animal類型");12 }13 14 public static void main(String[] args){15 //animals可以引用dogs數組16 ArrayList<Dog> dogs = new ArrayList<Dog>(); 17 dogs.add(new Dog());18 ArrayList<? extends Animal> animals = dogs; 19 //當animals引用集合時,集合元素為Dog類型20 animals.get(0).showClass();21 //當dogs引用集合時,集合元素為Dog類型22 dogs.get(0).showClass();23 //無法通過animals對集合進行修改(無法通過編譯)24 //animals.add(new Dog());25 26 }27 28 }29 30 31 class Dog extends Animal{32 public void showClass(){33 System.out.println("集合元素為Dog類型");34 }35 }
集合在多態中的使用
當然List<object>集合可引用ArrayList<object>集合