登陆 | 注册 设为首页 | 加入收藏 | 联系我们
太和养老网
热词老年艺术  助老机构  养老系统  

中心区域北京 天津 河北 山西 内蒙古 辽宁 吉林 黑龙江 上海 江苏 浙江 安徽 福建 江西 山东 河南 湖北 湖南 广东 广西 海南 重庆 四川 贵州 云南 西藏 陕西 甘肃 青海 宁夏 新疆 香港 澳门 台湾 全国城市养老院目录 全国县市养老院汇总目录 太和AI作品展 太和养老艺术网AI作品展示

第十五节 斗法降三怪——泛型(1) - 飞外

 

2023/7/6 17:23:51 ('互联网')

《西游记》第15集 斗法降三怪

师徒四人来到车迟国。国王宠信三位道士——虎力大仙、鹿力大仙和羊力大仙,封他们为国师。他们作威作福,欺压僧人,悟空大为不平,设计戏耍国师。悟空携八戒、沙僧潜入三清殿,三人分坐神位,尽情享用供品。三位国师以为三清显圣,连连祈祷长生。悟空、八戒、沙僧以尿水作圣水赏赐给三位国师。三位国师受骗上当,叫苦不迭。三个妖精国师欲报受辱之仇,怂恿车迟国王留下唐僧与他们比试法力。悟空保护师父,先斗坐禅,再斗祈雨。妖道均遭失败。悟空使出降妖手段,将虎、鹿、羊三妖复还原形,放逐山林。

0.本章都讲了什么?

1.什么是泛型?

2.泛型的精髓:通配符

3.为通配符指定上下限(PECS原则)

(因字数限制,以下部分放入《第十五节斗法降三怪——泛型(2)》中)

4.利用注解、反射和泛型来写一个导入导出的通用组件(附源码下载)

5.Eclipse安装lombok插件步骤

======================================

1.什么是泛型?

在《西游记》里,为何悟空、八戒、沙僧三人可以假冒三清显圣?三个妖怪为何可以冒充国师鱼肉百姓?孙悟空三人为何可以冒充三圣?三位国师为何为不清尿与圣水?这就是类型检查不严格惹的祸。一般在创建对象时,将未知的类型确定具体的类型。

当没有指定泛型时,默认类型为Object。就像上节讲集合框架时最后的那张图,所有的类型在装箱(存储)时都被打回最原始的父类:Object,然后在使用的时候进行类型转换。

集合框架中的元素千差万别,一个不小心便会产生ClassCastException(类型转换异常)。比如这个例子:

package com.xiyou;import java.util.ArrayList;import java.util.List;public class Test {public static void main(String[] args) {List arrayList = new ArrayList();arrayList.add(new SunWukong());arrayList.add("猴毛");arrayList.add(1000);arrayList.forEach(str -> {//强制类型转换成SunWukong,并调用获取姓名的方法System.out.println(((SunWukong)str).getName());});}}

输出结果为:

孙悟空

Exception in thread "main"

java.lang.ClassCastException: java.lang.String cannot be cast to com.xiyou.SunWukong

at com.xiyou.Test.lambda$$0(Test.java:16)

at java.util.ArrayList.forEach(ArrayList.java:1249)

at com.xiyou.Test.main(Test.java:14)

为什么会发生这种情况呢?

很可能是程序员在编程的时候,误以为list里面存的都是孙悟空的对象,所以才简单粗暴的进行转换,进而导致了类型转换异常。

怎么来解决这个问题呢?

Collection虽然可以存储各种对象,但实际上大多数情况下Collection中只存储同一类型对象。因此在JDK5之后,新增了泛型(Generic)语法,让你在设计API时可以指定类或方法支持泛型,这样在使用API的时候也变得更为简洁,并得到了编译时期的语法检查。

泛型的语法为:在集合框架的后面加上类型限制,比如:<String>或是<Sunwukong>等等。

如果程序员设定上例中的那个List只是存储孙悟空对象,那和我们可以对程序做如下改写:

增加了泛型的情况下,代码编译器就会帮你做检查,如果放入了不符合限定规则的数据就会报错,避免了之后问题的发生。不仅是集合框架的定义,泛型同样可以用来将数据类型应用到不同的类、方法、接口当中,将数据类型作为参数进行传递。

其实,在运行上节的例子时,相信很多人也都发现了代码编译器的一些异样:

自从JDK5开始加入泛型概念以后,便不推荐像上面那样不加限制的使用泛型类和泛型接口了。因为要向下兼容,因此并非不允许你这样做,而是给出警告,提示你慎重考虑一下,是否要加上泛型呢?如果你死心塌地的不加,它也是没有办法的,一样会正常的编译运行,只不过风险就会增大了,不符合推荐的开发规范。

既然使用List的时候会给出警告,那么就可以知道List是一个泛型接口,ArrayList是一个泛型类。

什么意思?

我们先来看看List的源码:

public class ArrayList<E> extends AbstractList<E>        implements List<E>, RandomAccess, Cloneable, java.io.Serializable {    //实现Serializable接口,生成的序列版本号:    private static final long serialVersionUID = 8683452581122892189L;    //ArrayList初始容量大小:在无参构造中不使用了    private static final int DEFAULT_CAPACITY = 10;    //空数组对象:初始化中默认赋值给elementData    private static final Object[] EMPTY_ELEMENTDATA = {};    //ArrayList中实际存储元素的数组:    private transient Object[] elementData;    //集合实际存储元素长度:    private int size;    //ArrayList有参构造:容量大小    public ArrayList(int initialCapacity) {        //即父类构造:protected AbstractList() {}空方法        super();        //如果传递的初始容量小于0 ,抛出异常        if (initialCapacity < 0)            throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity);        //初始化数据:创建Object数组        this.elementData = new Object[initialCapacity];    }    //ArrayList无参构造:    public ArrayList() {        //即父类构造:protected AbstractList() {}空方法        super();        //初始化数组:空数组,容量为0        this.elementData = EMPTY_ELEMENTDATA;    }    //ArrayList有参构造:Java集合    public ArrayList(Collection<? extends E> c) {        //将集合转换为数组:        elementData = c.toArray();        //设置数组的长度:        size = elementData.length;        if (elementData.getClass() != Object[].class)            elementData = Arrays.copyOf(elementData, size, Object[].class);    }    //将ArrayList的数组大小,变更为实际元素大小:    public void trimToSize() {        //操作数+1        modCount++;        //如果集合内元素的个数,小于数组的长度,那么将数组中空余元素删除        if (size < elementData.length) {            elementData = Arrays.copyOf(elementData, size);        }    }    public void ensureCapacity(int minCapacity) {        int minExpand = (elementData != EMPTY_



扫码加微信详细咨询太和智慧养老产品和平台服务!

 

 





版权声明:

---------------------------------------------------------------


所有信息来源于互联网,本文的版权归原作者所有,不代表本网观点和立场。

本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 81480447@qq.com 举报,一经查实,本站将立刻删除。



扫码加微信详细咨询太和智慧养老产品和平台服务!

 

养老资讯
助老机构介绍
评论
已有 0 条评论

最新评论

推荐养老院

您希望养老院位于
  • 不限
  • 东城
  • 西城
  • 崇文
  • 宣武
  • 朝阳
  • 丰台
  • 石景山
  • 海淀
  • 门头沟
  • 房山
  • 通州
  • 顺义
  • 昌平
  • 大兴
  • 怀柔
  • 平谷
  • 延庆
  • 密云
您希望的价格范围
  • 不限
  • 500以下
  • 500-1000
  • 1000-2000
  • 2000-3000
  • 3000-5000
  • 5000以上
老人的情况是
  • 不限
  • 自理
  • 半自理
  • 全护理
  • 特护

姓名

年龄

电话

全国城市养老院



关于我们 | 联系方式 | 网站地图 | 友情链接

Copyright 2010-2022 京ICP备18035644号-3 北京太和 版权所有