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

数组在多态中的使用

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

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

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

 /*验证:
*animals和dogs可以引用同一个数组
*当animals引用数组时,数组元素为Animal类型
*当dogs引用数组时,数组元素为Dog类型
*/ public class Animal{
private void showClass(){
System.out.println("数组元素为Animal类型");
} public static void main(String[] args){
//animals和dogs可以引用同一个数组
Dog[] dogs = {new Dog(), new Dog()};
Animal[] animals = dogs; //当animals引用数组时,数组元素为Animal类型
animals[0].showClass();
//当dogs引用数组时,数组元素为Dog类型
dogs[0].showClass();
//不可通过父类型的数组引用向集合加入除子类型及其下层级的之外的元素(可通过编译,运行过程出错)
animals[0] = new Animal();
} } class Dog extends Animal{
public void showClass(){
System.out.println("数组元素为Dog类型");
}
}

泛型在多态中的使用

ArrayList<父类型>无法引用ArrayList<子类型>

 /*验证:
*animals无法引用dogs数组
*
*/
import java.util.*; public class Animal{ public static void main(String[] args){
//animals无法引用dogs数组
ArrayList<Dog> dogs = new ArrayList<Dog>();
ArrayList<Animal> animals = dogs; /* 无法通过编译 */
} } class Dog extends Animal{ }

为了弥补泛型的缺陷,java引入了一种“万用字符”——ArrayList<? extends object>
此类型集合可引用任何参数上继承、实现了参数类型(包括参数类型本身)的集合

 /*万用字符
*animals可以引用dogs集合
*当animals引用集合时,集合元素为Dog类型
*当dogs引用集合时,集合元素为Dog类型
*无法通过animals对集合进行修改
*/
import java.util.*; public class Animal{
public void showClass(){
System.out.println("集合元素为Animal类型");
} public static void main(String[] args){
//animals可以引用dogs数组
ArrayList<Dog> dogs = new ArrayList<Dog>();
dogs.add(new Dog());
ArrayList<? extends Animal> animals = dogs;
//当animals引用集合时,集合元素为Dog类型
animals.get(0).showClass();
//当dogs引用集合时,集合元素为Dog类型
dogs.get(0).showClass();
//无法通过animals对集合进行修改(无法通过编译)
//animals.add(new Dog()); } } class Dog extends Animal{
public void showClass(){
System.out.println("集合元素为Dog类型");
}
}

集合在多态中的使用

当然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. BZOJ2698染色

    2698: 染色 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 223  Solved: 150[Submit][Status][Discuss] De ...

  2. 详解Grunt插件之LiveReload实现页面自动刷新(两种方案)

    http://www.jb51.net/article/70415.htm    含Grunt系列教程 这篇文章主要通过两种方案详解Grunt插件之LiveReload实现页面自动刷新,需要的朋友可以 ...

  3. ExcelUtil

    package cn.com.jansh.core.util; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi ...

  4. 7 款华丽的 HTML5 Loading 动画特效

    我们在进行大数据的传输或者复杂操作的等待时,最好能有一个Loading等待的小动画提示用户.本文将为大家分享一些超华丽的基于HTML5的Loading加载动画特效,希望你会喜欢. 1.HTML5 Ca ...

  5. 使用(Drawable)资源———AnimationDrawable资源

    AnimationDrawable代表一个动画. 下面以补间动画为例来介绍如何定义AnimationDrawable资源,定义补间动画的XML资源文件已<set.../>元素作为根元素,该 ...

  6. PHP文件夹文件拷贝/复制函数 dir_copy($src = '', $dst = '')

    /* * 文件夹文件拷贝 * * @param string $src 来源文件夹 * @param string $dst 目的地文件夹 * @return bool */ function dir ...

  7. php将图片以二进制保存到mysql数据库并显示

    一.存储图片的数据表结构: -- -- 表的结构 `image` -- CREATE TABLE IF NOT EXISTS `image` ( `id` int(3) NOT NULL AUTO_I ...

  8. js判断MAC地址

    function white_mac_FormCheck(mac)    {           var temp = /[A-Fa-f0-9]{2}:[A-Fa-f0-9]{2}:[A-Fa-f0- ...

  9. HTML <div> 和<span>

    HTML <div> 和<span> HTML 可以通过 <div> 和 <span>将元素组合起来. HTML 区块元素 大多数 HTML 元素被定义 ...

  10. pureMVC简单示例及其原理讲解五(Facade)

    本节将讲述Facade,Proxy.Mediator.Command的统一管家.自定义Facade必须继承Facade,在本示例中自定义Facade名称为ApplicationFacade,这个名称也 ...