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

数组在多态中的使用

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

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

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

 /*验证:
*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. bzoj2555

    开始时间:19:40 完成时间:21:00 传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2555 题目大意:(1):在当前字符串的后面插入一 ...

  2. 微软2017MVP大礼包拆箱攻略

    容我本周偷个懒,晒个大礼包就糊弄过去了.13号晚上拿到的大礼包,激动的没敢拆,一直等到娃睡着了,才偷偷打开了快递,忍了两天没忍住,上来晒图得瑟一下,请各位轻拍,谢谢! 1.大礼包的盒子(联邦快递的盒子 ...

  3. 笔记-Python基础教程(第二版)第一章

    第一章 快速改造:基础知识 01:整除.乘方 (Python3.0之前 如2.7版本) >>> 1/2 ==>0 1/2整除,普通除法: 解决办法1: 1.0/2.0  ==& ...

  4. Python - Headless Selenium WebDriver Tests using PyVirtualDisplay

    Here is some Python code showing WebDriver with a virtual display provided by Xvfb: #!/usr/bin/env p ...

  5. iOS 之 调试、解决BUG

    iOS 解决一个复杂bug 之 计分卡 iOS 调试 之 打印 iOS 错误之 NSObject .CGFloat iOS bug 之 H5 页面没有弹出提示框 iOS 日志工具 CocoaLumbe ...

  6. QStandardItemModel的简单应用

    The QStandardItemModel class provides a generic model for storing custom data. QStandardItemModel提供了 ...

  7. C++中lower_bound函数和upper_bound函数

    STL中关于二分查找的函数有三个lower_bound .upper_bound .binary_search .这三个函数都运用于有序区间(当然这也是运用二分查找的前提),下面记录一下这两个函数. ...

  8. HTML <head>

    HTML <head> 元素 <head> 元素包含了所有的头部标签元素.在 <head>元素中你可以插入脚本(scripts), 样式文件(CSS),及各种met ...

  9. easyUI linkbutton组件

    easyUI linkbutton组件: <!DOCTYPE html> <html lang="en"> <head> <meta ch ...

  10. 我的小工具开源一下-PingTest

    v博客前言 先交代下背景,最近我们项目组的网络真是太渣了,时常remote不了另外一个地方的机器,过个几分钟就断开连接,太烦躁了,严重影响工作心情...于是想着做个工具记录下每天的断开remote连接 ...