00:00
好,那么接下来呢,我们来讲下边一章,这一章呢叫做泛刑,泛刑呢这一章呃,看着跟这个集合呢是并列关系的,但是这一章的内容呢,相对来讲就会少一些,所以今天呢,咱们讲完现发型以后,还会讲到下一章叫做IO流,诶这样啊,那么后在后边呢,叫网络编程,这个网络编程呢,相当于是在网络当中实现数据的一个IO。嗯,所以说呢,这个讲网络编程之前呢,得先讲IO,讲完IO以后,我们就可以讲这个网络编程,而我们在外部阶段,整个咱们讲完这个移动以后呢,相当于这个基础阶段就是讲完了,那么讲web阶段的话呢,其实主体上都是一种网络编程的方式,所以说整个这个web web咱们不也就叫Java web嘛,嗯,整个呢,我们就通过这个叫浏览器端,或者说呢,叫客户端啊,我们可以通过网络的方式,咱去访问这个Java的这个服,呃,访问这个比如他们开的服务器,在他们开的服务器里边写它的组件里边呢,我们去写这个相应的Java代码啊,后续呢,还要操作这个数据库,数据库呢实现的就是你这些数据的一些持久化啊这样的一个过程,那在这里边呢,涉及到这个数据呢,传输,这个传输呢,其实就相当于是一个IO一样哈,哎,我们呢,要讲一讲这个,这个呢,其实重心呢,在外部阶段去讲讲,咱们在这块呢,也基本的让大家去清楚,那么实现网络的一个编程啊,基本的有哪些结构,涉及到哪些。
01:24
基本的技术,哪些常见的协议啊,这样的一些问题啊,好,然后后续呢,我们到时候再说,那今天呢,我们先来看一下这个泛型,那泛型呢,打开以后先来看下这个PPT,上面呢,提了提供了一个PDF,这呢是一个,呃,这个就像一个word一样啊,一个非常简短的一个关于范型使用的一个芯本是吧?啊这个页数呢不多,是因为呢,它只是一个新特性,不会像集合一样啊,里边我们涉及到这个信息量呢,就比较大一些啊,那我们直接呢,就根据这个PPT来讲解就可以了。那么关于泛型这一章,我们呢,主要说这样的几个事情,第一个为什么要有泛刑啊,第二个在集合当中如何呢去使用泛型,这个集合呢,不管是它里边的接口还是类,在定义的时候呢,其实它都使,呃都定义的时候呢,都已经使用泛型了,咱们呢,在截止到目前为止哈,开发当中咱们还没有用到泛型,那今天呢,我们讲泛型就要用一下,通过这个呢,大家也体会一下泛型到底有什么意义啊,在集合中用一下你就知道了,在接下来这个泛型呢,我们像集合里边都已经定义好了,咱们呢还可以去自定义一些泛型结构,如果需要的话啊,发型类,发型接口,发型方法等等,我们都可以自己来定义。
02:44
OK,在下面说发型呢,在技能方面的一些体现,这就涉及到一些细节知识了,在后边呢,提到一个通配符的使用啊,发型的应用举例啊,这就完了,整个的话呢,你一看其实也能知道这个知识容量的话呢,有限。
03:00
啊,有限行,那我们就按照这个顺序来说,首先为什么要有泛型,为什么要有泛型之前你得先知道什么是泛型,哎,所以我们先看一个例子,说泛刑啊,大家一定程度上呢,可以把它理解成是一个叫标签。哎,就有点像,咱们看一下这个所谓的源码ctrl shift t,大家呢,去找一下这个叫collection。找到这个collection,打开以后你会看到这有一个监控号,这呢就叫泛型,它这个标识它就是像个小标签一样,那这个标签是什么意思呢?生活当中接触了很多,现在我们泛泛的去理解一下生活当中的标签,比如说进中药店的时候,每个抽屉外边呢都贴着标签。这呢我放了个图,就是这呢是一个盒子了,一个抽屉,那这个抽屉也好,盒子也好,它其实也是一个容器,就像是我们Java当中的集合一样,那么这个容器呢,它外边写了一个标签,通过这个标签啊,不用看是大黄还是啥哈,就知道这里边表示呢,就是里边你放的东西。
04:10
对吧,表示放的东西,那那你要是找的话呢,是不是直接通过标签就知道里边是什么呀?哎,对的啊,那么这呢,其实也可以看成是个容器,咱们Java中的这个集合呢,也是容器,那到目前为止咱们也都知道哈,比如说你用一下这个list。咱们用它的时候呢,哎,那就是调里边爱的方法了,这个方法的参数咱们到目前为止知道的,它是什么类型啊,是不是不这个类型,哎,就相当于呢,是不是任何类型的数据都可以往里扔,那其实呢,这可以看成是它的一个弊端。以前咱们讲说集合和数组的区别啊,有的同学呢,把那个数组说数组呢只能放单一数据类型啊,说呢,你声明的是string只能放string啊,声明的是int只能放int,实际上那是相当于数组的优点啊,就是它非常严格,这样才能让你这个语言更严密,它才不会有些漏洞啊。那像我们这里边呢,说list它倒是什么都能放了,但你什么都能放呢,这个时候呢,就控制起来就不严格了,比如说我们想用list的,呃,把这个班里边所有的学生成绩呢都装进去,但是你有可能呢,呃,因为没有这个限制,会误装进一些其他的数据类型的变量了。
05:28
就会有这样的一些问题了啊,那JDK5.0之前就相当于呢,就是这种情况,什么类型都可以往里装,没有任何限制,那么这个JDK5.0的时候呢,加了一个新特性,就叫做泛型。哎,在它往里加的时候呢,我们去限制它的类型,就像这个位置我加一个叫大黄一样啊,我写上它以后呢,我这里边儿只能去放大黄,不能放别的。哎,就更严格一些啊,或者要更清晰了,还有像这个超市里边购物架上的这个瓶子,每个瓶子装的是什么,它都有一个标签指明呢,你这里边装的这个东西啊,那其实还可以再举例子,就像呢,大家这个比如生活都是小区了啊,小区呢,你看以前咱们这个楼下放这个垃圾桶的时候。
06:18
可能一个不够,他放了好多,但是这个垃圾桶里边呢,它垃圾桶每个放什么没有任何标识,纯粹的就是多加了一个啊,什么东西都往里边扔,那你这个扔完以后啊,那么这个垃圾呢,就会这个运到这个垃圾的这个叫分拣的这个地方,它呢需要把这里边这个垃圾呢进行一个分类,那那这个任务量其实挺大的哈,这个这个相对这个工人的这个分班倒,这里边呢,有一些呢是可以回收再利用的,有一些呢又属于这种重金属的,像你那个电池啊等等,还得专门挑出来啊,像塑料袋的以前呢,不可以降解啊,还得专门拿出来,把这个垃圾呢,得分成好多类,这呢都是专门呢有这个垃圾分拣这个位置啊,这个地方去做的,这是以前扔垃圾是这样子的,那么后来的话呢,说这样不太好,什么都往里扔啊,然后呢,接下来这个小区呢,你看都替换成这个垃圾桶,给你上面贴个标签。
07:14
就是最起码它会有两两类了哈,那一类呢,就是叫可回收的,对那个叫不可回收的,有的小区好一点呢,可能再放一个专门让你放电池的一个口啊,这个当然再好的,国内目前应该好像就就即使有可能大家呢,这个文明程度也也也好,能到不了那种分的极其细的程度了才是吧,你要再整一个说这专,这专门的是这个厨房的一些,呃,这个这果皮啊,一些蔬菜啊这样的一些东西,然后呢,另外呢,就是专门放这个什么其他的一些生活垃圾啊等等,呃,可能那么细的话呢,很多人扔也不按照这个扔了,但是最起码呢,分成一个叫可回收的和不可回收的,这样的话呢,你分好以后再往这个垃圾回收站去分拣的时候,只有他们这个任务量会极小,或者我们说一个理想状态呢,就它就不用再去分解了啊,这呢就是我们把这个垃圾分类跟不分类的一个区别,肯定分的更好,那么我们这个在集合当中用。
08:14
行也是这样,那不用的话呢,就跟这个原来没有标签一样,那用上这个,呃,这个这个放行以后,就相当于这个垃圾桶上面带了个标签,说我这里边只能放可回收的,你不可回收的那些呢,就不能往里扔,说我这个呢,集合list只能往里边放string,你这个其他的数据类型就不能往里放,诶就是这样的一个特点,哎大家呢,先有一个直观的一个想啊,这个这个一个感受啊。啊,具体说到这个垃圾的这个分拣的话呢,其实这块全世界都应该向日本学习了,是吧?啊日本这块呢,做的简直都到这个变态的程度哈,把这个垃圾呢分的极细,而且呢就当就就就就就拿一张这个纸来说哈,他们这个纸的话呢,这个又利用好几好几轮,这个最好的纸呢,是先让那个小孩子喝奶的那个纸,就那个纸喝奶喝完以后呢,他就让那个小孩呢,还得剪开去洗干净晒,晒完以后呢回收,回收以后呢,他们是是第二档去做报纸啊,还是第三档做报纸啊,它那个纸呢,要翻来覆去的用好几遍啊,最后呢才才处理掉啊,就是非常的这个严格啊,而且呢,日本呢每家每户呢,你不能说自己想扔垃圾了,这个这个一看,诶外边天气挺好,不冷诶扔扔出去了不行,他们每周的话呢,好像只固定两个时间来收垃圾,到那个点呢,你把垃圾拿出去啊,你要说这个错过那个点了,那就等你下一次,哎,到那个点的时候你再去扔,其他时间要扔的话呢,还犯法好像说啊对。
09:44
非常严格啊,就是你会看到在日本的话呢,基本上它这个垃圾桶就相对于少一些了,它就是你你比如说你在路上这个旅游是吧,旅游的话呢,你这个想随便扔东西,那就别想了,肯定不好啊,它也没有地儿让你去扔,你得准备个小塑料袋啊,先扔到这里边,等你到某个位置有那个垃圾桶的时候呢,你再再扔到那里边,所以你会看到垃圾桶相对来讲少一些,国内的话呢,那遍利都是垃圾桶是吧?啊你要去欧洲的话呢,你会发现欧洲的垃圾桶也比较少,但欧洲的话呢,不是说跟日本一样,欧洲呢主要是怕别人往里边放炸弹是吧?啊对,他跟这个日本呢,还是有很大区别的啊嗯,就日本呢,其实在很多方面呢,咱们得承认这个值得是学习的啊,其实你想想日本这个地儿也挺惨的,就是这个没啥资源,天天地震海啸的是吧,啊,逼着这些人的素质呢,都得提高啊,所以对于日本来讲,他们始终觉得自己在这个一个船上,其实是吧,你看就就从地图上看,它就是一一小片。
10:44
其实就跟船一样,所以他老想回大陆是吧,他想回这个陆地上,就是回到咱们这个地儿是吧,嗯,对他们确实没有啥安全感啊,所以逼着他们这个民族呢,就得不断的去创新啊,去去这个什么是吧,当然现在他们的一个严重问题就是年龄老龄化,老龄化问题特别严重啊,好,这个咱们就呃听一下他们这样一个事儿呢,就乐呵一下就行是吧,然后回过来哈,这个接着呢,我们看着这个叫泛型,刚才呢,我们举了几个例子,让大家呢,通过生活中的例子呢,你去感受一下,我们为什么要用这个泛型啊,这里边写了把元素的类型设计成一个呢,参数。
11:29
这个参数呢,这个类型的参数就叫做泛型,就我们看到的像collection当中这呢,加了一个E,我加的这个E会影响我下边的什么结构呢,你会看到我这里边儿的方法。比如说咱们找到这个典型的叫爱的方法,你会看到这个爱的方法的这个添加的这个对象呢,它不再是object了,而是上面你写的那个标签一。那么当我们去造对象的时候,当然了,咱们造对象肯定是用的它的具体实现类了哈,造对象的时候呢,你去指明这个E到底是什么类型,比如说这个E呢,是string型,注意这个E呢,它表示的是一个类型啊变量类型,我这呢,一旦声明成string型的时候,我下边这个方法。
12:15
你在调的时候呢,这个E就是string e呢,就是其他类型就进不来了,哎是这样子的,所以我们接下来呢,关于这个泛型的一个使用,看下边一个描述啊,看一下说所谓的泛型就是允许在定义类或者是定义接口的时候,通过一个标识,这个标识呢来表示类中某个属性的类型,或者是某个方法的返回值及参数类型。咱们刚才呢,定义的这标识不就影响了爱的方法的参数类型了吗?哎,你上面指定的是string,我这个爱的方法的这个行参,就是string,说这个类型参数将在使用的时候,就是你调这个方法的时候啊,诶这个当然调方法时候呢,提前已经确定了,就是你造对象的时候呢,已经定好这个类型是什么了,当你在调这个方法的时候呢,就是你指定的这个类型,就这样的一个意思啊,然后JDK1.5引1.5的时候呢,咱们引进来的这个泛型啊,在集合当中啊,咱们JK5.0的时候呢,引进了泛型了,咱们就把这个集合框架的代码实际上呢,就重新的改造了,就都改造成有这种泛型的结构啊,这是相当于一个历史啊,那么在接下来我们在举个例子,就是说咱们在集合当中使用泛刑和不使用泛刑有哪些区别,通过这个区别呢,大家更好的再去理解说为什么要有反性。
13:37
好,下边呢,我们就开始举这个例子,咱们先在当前功能下新建一个module。新颖model还是一个普通的一个Java的一个工厂啊,哎,对零八。
14:01
这个泛型这个英文呢叫generic啊,所以关于它的一个测试这呢,我们来说明一下,叫泛型的一个使用。哎,首先呢,我们提到第一个点就是这个泛型是JDK5.0或者叫1.5啊,新增的这个特性啊好,那下边呢,我们来看一下这个泛型,说理解它的一个好处,咱们就通过集合来讲解了,先来看一下在集合中使用泛型之前是一种什么情况,然后呢,咱们再用一下使用之后。在集合中使用泛型之前看的这个情况,Al enter导进来我们这个unit行,下面我们来写这个代码,这个代码的话呢,不妨我就以这个a list为例了,咱们之前呢,其实都是这样写的,我去造一个a list list等于new一个a list行做完了,做完以后呢,我这时候调这个list点艾的方法。
15:06
大家会看到我们这个参数呢,就是一个类型。Object这类型,那这儿呢,我就可以往里放数据,那现在呢,咱们是一个实际问题,这个实际问题呢,我就是要将这个比如说幼儿园的这个小朋友,他们的这个考试成绩啊,考试成绩呢,就放在这里边,比如有的呢,78分啊,哎,这样我就随机的放几个数,这个小学呢,一般咱们或者这个年龄小的时候呢,好像是这个老师出的题都比较简单哈,经常一考考双百是吧,越往大的考的越少,一直到考研的时候呢,英语只要过有的就35分就行是吧,感觉要求好低啊,其实这个难度上还挺大的哈,这呢,我们往里边就放了几个这个数据啊,表示呢,就放在这个学生的成绩啊,我们这专门的这个需求。就是来啊,存放学生的成绩,但是呢,由于我们这个集合list呢,没有做任何的限制,我在艾的时候呢,你的参数是object类型,所以我完全是有可能混进,混进来一些是不是非这个学生成绩这个类型的一些数据啊,哎,我们就把这个Tom呢,你看我就加进去了,加进去以后不管是编也好,运行也好,都不会出任何问题,这其实是它的第一个啊,你不会出问题,它其实才是问题啊,这是咱们的这个问题一,就是相当于在编译的时候,它也没有任何的类型检查,哎,我们把它称作叫类型不安全啊,你没有去限制它存放数据的类型。
16:38
这方面呢,其实还不如出组。速度,然后我指明就是in型或者in型,你这个string呢就进不来,所以在这方面呢,这个集合呢,要向数组学习,嗯,这是我们的第一个问题,然后呢,你把这个成绩呢,都添加完以后,我们接下来呢,这个在另外一个位置呢,可能就想呈现,呈现呢就是你得便利输出,哎,我们做一个for for的时候,比如我们用一个增强for循环,那我们这儿看到的也只能是个object,然后呢,你写个哎叫score吧,成绩list。
17:13
这样子接着呢,就一个一个把这个成绩呢,就取出来,就放到我们这个高里边了,那SC里边假设呢,我们这个成绩呢,是装配到另外的一个变量上。我装备到另外一个变量上,那你已经知道我存的是学生成绩了,你装备的话呢,是不是就会把它放到某一个int型的一个变量上啊,比如这个我们就叫做student的一个score,我就想把你这个集合里边这个数据呢,取出来放到这里边,下边呢,你就做一些操作了啊这样,但是你现在呢,你这个scar往这一扔肯定不行,因为你目前是个类型。那只能是不是做一个转换,哎这样转一下,哎这个呢,Object类型它这可以优化了啊,直接呢,你写in的就行啊,或者你你要是呃,像这个更清晰的,你可以先是TE啊,这是object转成TE啊,有一个自动的拆箱啊,就转换成一个in了啊行,这是它拿到这个成绩以后,我们下边呢,就做一些装配的工作了,咱这呢,就是简单的做一个输出。
18:20
哎,这样就结束了啊,那么这里边呢,涉及到一个叫呃,强制类型转换,而我们以前讲这个面向对象的时候也提过啊,像这种呢,向下强转的这种,很多时候呢,是可能会出异常的啊这呢其实也就相当于咱们的这个,哎问题二。哎,问题二就是强转时。强转时呢,我们说就有可能,哎,出现这个叫类型转换异常啊,叫可拉cost的exception,因为呢,你一开始对我们存放这个成绩这块没有任何要求,别的类型呢,是可能混进来的,那一旦混进来以后,你这块呢,在强转的时候呢,它就有可能出这个问问题,哎,咱们现在这个情况,这不就出了吗。
19:10
我一执行这块呢,诶就出来一个class cost exception,前面几个没事,后边你这个Tom的话呢,它是肯定转换不成这个integer的,这就出这个错误了,那出这个错误的话呢,嗯,你得想什么原因造成的,这个时候呢,你在这块试图去解决,这是肯定解决不了的,你只能是回归到一开始啊,由于呢,你混进来一些不安全的数据,所以才导致我们后续出了问题,你要去揪呢,也得就揪到这儿来了,所以这个呢,你要注射掉,哎,它才能够解决这个问题。啊,这个时候呢才是正确的,那么相当于我们就希望不能让咱们当前这个例子当中去混进来一些其他类型的变量,那我们就得需要呢,在添加的时候呢,做一个类型的检查,这个检查这个事儿呢,其实呢,就是我们考虑在集合中使用反省。
20:06
啊,那接下来呢,我们就相当于引进来这个当中去如何使用泛型啊,这个呢,通过这个例子,咱们目前能看到的就说没有泛型,呃,还是有一些不方便的啊,那下边呢,我们来讲,哎,在集合中去加入泛型。
我来说两句