java数组、泛型、集合在多态中的使用及对比
我们在使用数组,泛型集合的过程中不可避免的会碰到多态,或者说什么情况下能如何使用父数组引用子数组(集合、泛型)呢?
数组在多态中的使用
元素为父类型的数组引用可指向元素为子类型的数组对象
当数组被调用时由当前引用确定数组元素的类型
当元素为父类型的数组引用指向了元素为子类型的数组对象时,不可通过父类型的数组引用向集合加入除子类型及其下层级的之外的元素(可通过编译,运行过程出错)
/*验证: *animals和dogs可以引用同一个数组 *当animals引用数组时,数组元素为Animal类型 *当dogs引用数组时,数组元素为Dog类型 */ publicclassAnimal{ privatevoidshowClass(){ System.out.println("数组元素为Animal类型"); } publicstaticvoidmain(String[]args){ //animals和dogs可以引用同一个数组 Dog[]dogs={newDog(),newDog()}; Animal[]animals=dogs; //当animals引用数组时,数组元素为Animal类型 animals[0].showClass(); //当dogs引用数组时,数组元素为Dog类型 dogs[0].showClass(); //不可通过父类型的数组引用向集合加入除子类型及其下层级的之外的元素(可通过编译,运行过程出错) animals[0]=newAnimal(); } } classDogextendsAnimal{ publicvoidshowClass(){ System.out.println("数组元素为Dog类型"); } }
泛型在多态中的使用
ArrayList<父类型>无法引用ArrayList<子类型>
/*验证: *animals无法引用dogs数组 * */ importjava.util.*; publicclassAnimal{ publicstaticvoidmain(String[]args){ //animals无法引用dogs数组 ArrayList<Dog>dogs=newArrayList<Dog>(); ArrayList<Animal>animals=dogs;/*无法通过编译*/ } } classDogextendsAnimal{ }
为了弥补泛型的缺陷,java引入了一种“万用字符”——ArrayList<?extendsobject>
此类型集合可引用任何参数上继承、实现了参数类型(包括参数类型本身)的集合
/*万用字符 *animals可以引用dogs集合 *当animals引用集合时,集合元素为Dog类型 *当dogs引用集合时,集合元素为Dog类型 *无法通过animals对集合进行修改 */ importjava.util.*; publicclassAnimal{ publicvoidshowClass(){ System.out.println("集合元素为Animal类型"); } publicstaticvoidmain(String[]args){ //animals可以引用dogs数组 ArrayList<Dog>dogs=newArrayList<Dog>(); dogs.add(newDog()); ArrayList<?extendsAnimal>animals=dogs; //当animals引用集合时,集合元素为Dog类型 animals.get(0).showClass(); //当dogs引用集合时,集合元素为Dog类型 dogs.get(0).showClass(); //无法通过animals对集合进行修改(无法通过编译) //animals.add(newDog()); } } classDogextendsAnimal{ publicvoidshowClass(){ System.out.println("集合元素为Dog类型"); } }
集合在多态中的使用
当然List<object>集合可引用ArrayList<object>集合
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持毛票票!