00:00
大家好,我是海波老师,我们继续来讲Java集合中的泛型,前面说过了,泛型的语法呢,就是为了让我们在集合处理时啊,可以简化咱们数据类型的判断,以及呢进行类型的转换而使用呢,那么这样的话呢,就有一个问题了,我们的泛型是不是只可以在集合中使用,那么其他场合下能不能使用泛型呢?如果能使用,那该如何使用呢?所以啊,我们要给大家解释一下这个问题,如果解释之前呢,我们需要说明一下我们泛型和类型的区别,所以我们这里拷贝一下来复制。复制以后我写上一个零七啊,然后把这个写上一个下划线,咱们叫做dinner,诶好了,把它复制一下,点击OK,点击OK以后,这个名字呢,我们换一下,然后呢,把下面这个东西啊,咱们全都给它去掉好啊,这个呢,我们也给它去掉就可以了。那么接下来呢,我们就给大家讲一讲,我们说了叫泛型和类型的区别,所以图图啊,咱们叫泛型和类型的区别,我们这里啊,通过画图的方式呢,给大家去解释一下,那么这里呢,我们首先画一个蓝色的小方框,然后呢,我们再画一个我们的小方块啊,放到里面去,放到里面去以后呢,我们把它拉大一些,把你的文字我去掉好了,然后呢,我们说明一下,我们外面的蓝色的这个对象呢,我们表述的含义非常简单,它是一个我们aler啊,就是一个外部的一个类的对象,咱们叫alter。
01:18
然后呢,这个颜色呢,我们给他一个我们的白色。后呢,我们里面呢,给他写上一个我们称之为叫inner。好了,然后呢,把这个呢,我们给它放过来啊,哎,好了,一个叫alter,一个叫inner,这里我们用一个黄色来表示一下,比较醒目一些啊好。那么我们现在怎么去理解泛型和类型呢?其实很简单,我们的所谓的类型呢,就是约束我们外部蓝色的小方块这个对象它能使用的应用场景,所以呢,我们说一下用于约束我们叫外部对象的使用场景,哎,它就是我们的类型。这样我们这里给它写清楚就可以了啊,然后呢,箭头我们可以拿过来,好了,拿过来啊,我们给它标记上就可以了啊把这个al呢,咱们往这放就行了,当然那我们泛型呢,我们就给它拷贝一下啊,咱们复制复制以后放过来,我们用于约束,我们叫做内部。
02:13
内部对象的使用场景,我们就是我们的反型,哎,是这个意思啊,好了,我们把这个类型和泛型呢,用画图的方式先简单的说明一下,因为啊,我们这里的外部对象啊,它里面容纳了黄色的这个内部对象,所以外部的这个对象啊,我们简单的可以把它称之为叫容器也是可以的,但是啊,它并不一定非得是我们Java中的集合类,咱们自己的类只要满足了这样的约束呢,其实都可以,也就意味着我们自己的类中,如果属性也存在这样的操作,我们其实也可以用泛型,没有问题。那好了,我们来演示一下,我们这里呢,给大家声明一个类,我们叫做class,我们就叫做。MY啊,咱们叫container吧,咱们叫容器啊,来想象它,我们叫做todo,诶,我们叫容器类,那么容器类里面我们自己声明一个我们的属性,我们叫public,然后呢,给他一个date。
03:04
到是不对呀,这怎么没有类型呢?我们就希望呀,这个类型它不要确定,为什么呢?因为如果你确定了以后,那么我们就无法实现约束了,对不对,所以啊,我们这里希望呢,从外部呢,把这个约束的类型呢给我传过来,那我该怎么做呢?这就涉及到一个我们泛型的基本语法了,我要在类的后面我加上一个括号。这个间括号啊,就等同于一个传参的感觉,意味着你把参数给我传进来,那传什么,你要告诉我,那我传什么呢?哎,我就给他一个C,这个C是什么意思呢?它其实就是一个标识符,一般我们都是大写,它的含义呢,表述的是我们约束数据的类型,它的名称尽量要表述清楚你约束数据的含义,比方说你的C为什么是这样,因为我想定义它的类型嘛,所以我就给个C。这样的话,这就意味着你的C如果传过来了,就确定好了,哎,就感觉跟个参数一样,对不对,就是这种感觉,那好了,我把容器类准备好了,数据我也准备好了,那我现在就可以写上一个了,My container,然后呢,我把它放过来,写成my container,等于它new。
04:09
当前的这个对象我其实就准备好了,接下来我就往这个容器的类当中去添加数据了,来拷贝,拷贝以后啊,我们点一下,你会发现我们这里的it,你放什么样类型的对象都可以,为什么?因为我们没有对它进行任何的约束,所以我们写上它,我们等于new object。你放什么其实都是可以的,但是呢,如果我在这个类的后面,我增加了一个间括号,我要给他做约束了,那么这时候我再添加一个类,我们叫做U7。啊,写完了以后,你把U7你放到这里来,诶,你就会发现我们当前下面的数据就不能放这个object了,为什么?因为我已经明确的告诉你,我们要用U的七来约束这个date的类型,它等同于把U的七传给了C,再把这个C的值传给了它,那么它就变成了U7,那么你这是肯定不能拿一个object来用的,这是肯定不允许的,对不对,所以啊,我们就感觉上是把这个U7啊,它传到了这个位置,所以我们有的时候呢,把泛型呢,也称之为什么呢,叫类型参数。
05:15
有时也把。泛型称之为我们的类型参数,哎,是这个意思啊,这个我们确定类型和我们传递类型的操作都是在编译时完成的,所以我们这个就得注掉了。好了,这个呢,我们就先说到这里,大家有一个泛型的直观认识就可以了,那么咱们继续啊,我们这里呢,再给大家声明一个方法,咱们叫public,然后呢,我们的static,然后word,我们叫test,好了,写完了之后呢,我把这个my container我放过来,给它加上一个尖括号,里面写上object,然后呢,给他来,我们写上这个of my container。好了,写完了之后呢,我在里面呢,直接拷贝我们打印它就可以了,诶就这么简单行了,那我写完了以后,我在这个地方呢,我就写上一个叫test。
06:06
把我们的my container呢,我给它传进去,传进去以后同学们你会发现这里标红了吧,标红了就说明我们这里是不对的,哎,为什么不对呢?我们这个里明显呢,我们是有个object,那我们的object是所有类的父类,那么我的U7是它的子类对象,那我把它传过来有什么问题吗?怎么这里还不让呢?哎,这个地方还确实不行,那为什么呢?给大家举个例子啊,我媳妇呢,让我去菜市场买水果对吧?让我拿一个袋子来装水果,那么我就拿了一个袋子就去了。然后呢,到了菜市场以后呢,我发现呢,哎,我媳妇买了一个榴莲,让我用这个袋子装起来,大家想一想啊,我们都是袋子,那榴莲也算是水果吧,那所以呢,我拿了一个装水果的袋子,我就去了,可是大家想想,装水果的袋子它等同于装榴莲的袋子吗?不一样吧,装水果的袋子,比方说你装个什么苹果呀,橘子呀,枣啊,什么葡萄什么的,那个袋子不需要太结实吧,对不对,能把它拎动就行了吧,但是你装榴莲的袋子是不是装不了啊,那你装榴莲的袋子你是不是一装就破了呀,对不对?这个大家能明白吗?哎,我相信大家能明白是吧?所以咱们总结一下啊,就是我们的类型啊,它存在多肽的使用,而泛型其实是没有多肽的。
我来说两句