我们在使用数组,泛型集合的过程中不可避免的会碰到多态,或者说什么情况下能如何使用父数组引用子数组(集合、泛型)呢?

数组在多态中的使用

元素为父类型的数组引用可指向元素为子类型的数组对象

当数组被调用时由当前引用确定数组元素的类型

当元素为父类型的数组引用指向了元素为子类型的数组对象时,不可通过父类型的数组引用向集合加入除子类型及其下层级的之外的元素(可通过编译,运行过程出错)

  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. class Dog extends Animal{
  18.  
  19. }

为了弥补泛型的缺陷,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. class Dog extends Animal{
  31. public void showClass(){
  32. System.out.println("集合元素为Dog类型");
  33. }
  34. }

集合在多态中的使用

当然List<object>集合可引用ArrayList<object>集合

java数组、泛型、集合在多态中的使用及对比的更多相关文章

  1. ajax 提交数组 泛型集合

    ajax 提交数组 泛型集合 发表于2015/12/31 14:26:29  5117人阅读 分类: mvc asp.net webapi ORM 转载:http://blog.csdn.net/li ...

  2. java数组和集合的相互转换

    由于在学习过程中经常碰到这么一个问题,就是java中几种装数据的容器之间的转换,所以写了这篇随笔专门来总结这些转换方法. 数组转集合: 1.遍历,最常用的方法,但是过程会繁琐一点 int arrs[] ...

  3. JAVA数组和集合谁是儿子

    Java有哪些数据存储方式? 基本数据类型(1byte3整2小数1字符1布尔)分别是byte,short,int long,flort,double,char,boolean(颜色好喜庆的样子O(∩_ ...

  4. Java数组转集合与集合转数组的坑

    在Java中将数组转为集合,会用到Arrays.asList()的方法,然而,这个方法却与我们的预期期望存在一些出入,当用到asList方法将数组转化成List列表时,对得到的List列表进行add( ...

  5. java 数组与集合(list)相互转化

    上代码 package com.core.array2collection; import java.util.ArrayList; import java.util.Arrays; import j ...

  6. java 数组和集合

    1.概念说明 区别:数组固定长度的,集合,数组的长度是可以变化的. List,继承Collection,可重复.有序的对象 Set,继承Collection,不可重复.无序的对象 Map,键值对,提供 ...

  7. java数组或集合返回空的问题

    在有返回值的情况下,平时我写代码基本遇到错误什么都是返回null,我因为我觉得把数组或集合这个初始化占空间. 但是我发现这样在每次客户段调用都要进行非空判断,而且有时调用内置api还容易报错误,于是解 ...

  8. Java数组转集合之Arrays.asList()用法

    Arrays.asList()用法 使用Arrays.asList()的原因无非是想将数组或一些元素转为集合,而你得到的集合并不一定是你想要的那个集合. 而一开始asList的设计时用于打印数组而设计 ...

  9. 关于数组和集合的冒泡排序中容易出现的IndexOutOfBoundsException

    数组只能存错一种相同的数据类型,集合只能存储引用数据类型(用泛型),集合的底层就是一个可变的数组. 数组的冒泡排序: public static void arrayMaxPaiXu(int[] ar ...

随机推荐

  1. UVa 11503 - Virtual Friends

    题目大意:给出若干对朋友关系,每给出一对朋友关系,就输出二者所在关系网中的人数. 首先是对每个人编号,使用map简化编号过程,然后就是使用并查集更新集合.要注意的是当给出A和B的朋友关系时,无论A和B ...

  2. 弹出式菜单(下拉菜单)实现——PopupMenu

    PopupMenu代表弹出式菜单,它会在指定组件上弹出PopupMenu,默认情况下,PopupMenu会显示在该组件的下方或上方.PopupMenu可增加多个菜单项,并可为菜单项增加子菜单. 使用P ...

  3. bzoj2049

    2049: [Sdoi2008]Cave 洞穴勘测 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 7579  Solved: 3548[Submit] ...

  4. OpenCV点滴2

    明天回家了-- 昨天去见了老师,去之前告诉自己不要紧张,去了后还是紧张了,语无伦次,很没礼貌--(不敢看老师的眼睛) 刚才妈打电话说让我早点回去,不知道为什么,在空荡荡的宿舍里听到妈的声音,眼泪会夺眶 ...

  5. console 高级用法

    console.log()用法,相信大家都很熟悉了,这里就不再啰嗦. 下面来玩几个新鲜点的,我用的是chrome28,不保证兼容其他浏览器:console.log的第一个参数中可以指定一个格式字符,这 ...

  6. MVVM指南(课程学习)

    iOS MVVM 参考 iOS MVVM 前世今生 iOS MVVM 优缺点 下面是我对MVVM知识的总结,主要包括模块划分.开发步骤.重点解说三部分.做这篇文章,主要是考虑总结出可执行的开发步骤,按 ...

  7. Android开发:View的几种布局及实践

    引言 View的布局显示方式有下面几种:线性布局(Linear Layout).相对布局(Relative Layout).表格布局(Table Layout).网格视图(Grid View).标签布 ...

  8. iOS 协议

    协议分为三部分:声明.引用.实现. 通常,声明协议和声明协议类型的属性都是在同一个类中.声明协议和声明协议作为属性在头文件中,引用在声明类的实现文件中.而实现协议则在其它类中.

  9. sqlloader外部表

    一创建目录 先在系统下创建 $ cd /home/oracle $ mkdir dir $ cd dir $ pwd 再在sqlplus里创建,让oracle知道这个目录 SQL> create ...

  10. Spring 使用context:annotation-config的设置

    Spring 使用context:annotation-config的设置: 还是需要声明Bean的,并且还可能自己定义Annotation: xml: <?xml version=" ...