《西游记》第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 举报,一经查实,本站将立刻删除。
扫码加微信详细咨询太和智慧养老产品和平台服务!
养老资讯
- 恒大海上威尼斯房价(恒大
- 击剑运动员孙一文(孙一文
- 德国有多少个世界遗产?世
- 休斯顿火箭队目前排名(N
- 中国女排精神作文题目(女
- 墨西哥和巴西哪个乱(墨西
- 世界杯24支球队赛制(2
- 哈维尔帕斯托雷(帕斯托雷
- 黎巴嫩男篮阿拉基(澳大利
- 独行侠如果和火箭队进行交
- 阿根廷总统贝隆(赫赫有名
- 勇士vs森林狼比分(勇士
- 2010男篮世界杯中国(
- 瓦兰丘纳斯交易(NBA现
- 北京奥运会奖牌长什么样(
- 维塔利 克利钦科(维塔利
- 中国女乒队长是谁(乒乓球
- 德国足球实力(德甲队在德
- 贝克汉姆伦敦奥运会开幕式
- 哥伦比亚简介(哥伦比亚国
- 法国队主教练多梅内克(法
- 2017nba全明星名人
- 猛龙队员名单2020(N
- 亚洲女足决赛地点(女足亚
- 英联杯最新比赛结果(英联
- 足坛十大组合(天下足球之
- 美洲杯帆船赛比赛规则(谁
- 凯尔特人战胜湖人(08总
- 篮球亚锦赛几年一次(亚洲
- 今天中央电视台节目单(央
- 8月22日 奥运赛事预告
- 尤尼克斯官网真伪查询网站
- 国足40强赛门票(足球比
- 巴西红耳龟咬人吗(请问这
- 梅斯医学官网(front
- 2008中国男篮vs梦之
- 世界排名前200名大学(
- NBA老鹰队以前的“鹰王
- 威廉富兰克林米勒(越狱里
- 欧洲杯意大利vs德国(意
助老机构介绍
姓名:
年龄:
电话: