00:00
大家好,我是海波老师,我们继续来讲Java中的集合,那么我们这里呢,创建一个新的代码来拷贝,拷贝以后我写上一个我们的零六啊,然后把它改一下,我们去掉。好了,然后呢,我们点击OK,点击完成以后,我把所有的东西呢,我们全都给它去掉,咱们先不要了啊,好去掉,去掉以后把这个呢,我们也去掉就可以了。那么咱们前面讲了Java中比较常见的两个集合,一个叫list和令LIST2个集合对象,那么我们这里啊,咱们说点别的,那说什么呢?说一下集合的一个间括号问题,哎,老师,什么叫做间括号问题呢?我们这里来准备一个数据,我们这里啊,创建一个我们集合的对象,我们叫list,等于new a re,我们的list,好写完以后呢,我们打开咱们的这个list啊,我们点一下,点完了以后,咱们往前看,你会发现我们的a list这个类啊,它其实是有个尖括号的。然后呢,里面写了一个意,诶写了这么个东西,那你说老师这是什么意思呢?这个我可不太懂啊,咱们之前我们给大家去演示一些我们的方法呀,功能的时候,并没有说到这个E呢,这是为什么?那么解释这个问题之前,我们先写一段代码,大家看一看,我们这里呢,先写上一个类,咱们叫class,我这里叫做U啊,我们的六,那么这里因为是他是六啊,我就写了个U的六,我担心会有冲突啊,好,把这个写个括号,然后我在里面添加一个方法,我叫public,然后呢,What,我叫test u,好了,写完以后呢,我在这里面打印一下,诶我们就写上它叫U,点点点就可以了。
01:30
那么写完之后呢,我们在这里创建对象,我们写上它叫U6,然后U它等于new咱们的U6就可以了,好,然后呢,我写上U的点,我们叫test u就可以了,好了这个就没有问题了,对不对,我们运行一下。运行以后,大家会发现我们的U点点点是不是就已经出来了,没有任何的问题,对不对?好,这个时候我们再给它声明一个我们的类,咱们叫class,咱们叫PERSON6好了,然后呢,把这个方法的名字呀,我们拷贝一下,拷贝以后改成我们叫test,我们的person,诶可以了啊,把这个写上它好,写上它以后,然后呢,把这个名字呀改成叫person,对吧?行了,那接下来呢,我把两个类啊,我建立关系,这不是person吗?我再把U的六啊,我们记成咱们的person a,我们写成一个六行了。
02:21
那我现在这么写完以后,大家想一想,我当前我们的PERSON6和U的六形成了父子关系吧,那么在咱们Java当中,我们是不是可以采用多态的语法来实现特殊的功能呢?所以啊,我们这里呢,把我们的U6啊,我改一下叫person。大家看一下,我改一下,改完了以后,大家有没有发现我们当前的第12行代码已经出现了红色字体了,就说明我们当前的idea它已经识别出来这个有问题了,这个是为什么呢?其实啊,原因很简单。这里的多态语法呀,它会将这个U的六这个对象的使用场景给它限制住,就是你当前的对象只能使用PORT6,它里面生存的属性和方法,你是不能用U6当中的属性和方法的,所以啊,大家看一下,我这么写是可以的,我叫u.test person,这个没问题,但是你的test user这是不允许的,这个就是我们之前在多态语法中给大家讲的场景的一种约束问题。
03:19
那么为什么这里要提到多肽呢?是因为啊,咱们刚才所看到的那个尖括号和这里的多肽语法的感觉它差不多,多肽呢是限定对象的使用场景的类型,而这个间括号的语法呢,是用于限定集合中元素的类型,那什么意思呢?咱们解释一下,集合呀,是容纳对象的容器,所以里面可以存储很多的数据,对不对?但是有的时候啊,为了处理方便,就要约束一下数据的类型或数据对象的行为,那比如学生集合中只能存放学生对象,那你不能把老师对象放进来,对不对?那就没有道理了。那么这里啊,就应该对学生集合进行限制,那如何限制呢?诶,就可以使用我们刚才看到的那个监括号,这个语法呀,我们称之为叫泛型语法。
04:05
那什么是泛型语法呢?其实不好理解,来咱们给大家演示一下,首先我们这里不是有一个叫release一个集合吗?然后呢,我们构建两个对象,这两个对象呢,我把这个继承呢给它去掉。好了,我去掉了以后,同学们,我把这个呢,我们都给它注掉啊,注掉注掉以后我构建两个不同类型的对象,好,我写上它,我们就叫做person吧,哎,咱们叫PERSON6,它等于person,等于new,我们叫PERSON6,好了,写完以后,然后呢,我再来一个,咱们叫U6,同学们,现在这两个对象没有父子关系了,我就这么写了,写完了以后把它改成U,改完了以后呢,我们现在干嘛呀,往这个集合里面放啊,咱们的list点增加,增加以后写上person,再来我们写上list点我们的增加,咱们叫U,我现在是不是就把我们当前的两个对象给我放到了我的集合当中,对不对,没有任何的问题。好了,那么这个时候呢,我从集合中将我对象取出来,比如啊,我们的第一个不是把portion给它存进去了吗?那我就取第一个,所以呢,我的list点我们叫get,给个零零表示第一个的意思,所以我们点一下VR回车,回车以后大家会发现我们拿到的对象的类型呢,是一个object,所以啊,这里咱们写上它从集合中。
05:24
获取的对象类型为我们的object。并不是我们的person,为什么呢?就是因为咱们的历史接口啊,它只是约束了如何管理和存储对象,并没有约束存储数据的类型,那么就意味着容器中可以存储任意类型的对象,而且啊,咱们随着数据的操作,内部的数据的位置还可能会发生变化,那么获取对象时实际上是不能确定数据的类型的,所以这个时候我们方法就要返回一个通用类型。这么设计啊,本身是没有问题的,但是你处理起来就不方便了,为什么?因为啊,就像我们之前说的多肽一样,你现在这种情况下,你就无法使用我们portion的方法,大家看一下,我们写上一个O,我们点你能把我们这个portion test portion拿到吗?你拿不到,你拷贝一下,你复制以后,你会发现它就变红了,为什么你访问不到?
06:15
那该怎么办呢?我得到的就是一个portion对象,为什么你不让我用这个方法呢?就是因为类型被限制住了,所以啊,咱们的多肽咱们讲过,它其实就约束了对象的使用场景,他只能在指定类型当中去使用它的属性和方法,哎,老师,那不行,我就想使用我的这个方法,难道你不让吗?可以啊,那么你就得做一个类型的转换了,所以咱们说一下来写上它,如果想要执行啊我们对象的方法,那么我们需要进行我们的强制类型转换,这个转换的方式比较简单,我们就叫PERSON6,哎,PERSON6,然后写上一个P等于括号,我们就写上叫PORT6,然后把这个O放过来,那这样的话,我们这个portion它就可以去访问了,哎,你这么写,你这么写就可以了呀,所以我们运行一下看结果,运行以后大家会发现没有任何的问题,你看这就可以了,对不对,所以啊,这个是对的,其实啊,如果仅仅是这样的话也还好,因为我们现在已经可以用了,对不对,但是。
07:15
如果我们把程序稍微的改动一下呢,比方说我们的list来,我们叫做点,我们叫我把这个零的数据给我清掉怎么办?如果你把零的这个位置的数据清掉以后,Portion就没了,那么我们的U就跑到了第一个,那么你取出来的是不是我们的UR啊?可是我问同学们,我的UR跟这个portion有关系吗?如果没有关系的话,他们能做强制类型转换吗?应该是不行的吧,所以我们运行一下看结果,你会发现我们当前的代码执行就会出现问题。问题的原因很简单,是我类型的转换的问题,所以你就会发现我们的集合对象在处理不同类型的数据的时候是非常繁琐而且不方便的。好了,那么我们现在呢,怎么去改善一下呢?问题出现了,其实很简单,就是因为你获取的对象并不是PERCENT6的类型,对不对?所以说你强制转换就会失败,那怎么办呢?诶,我们就可以这样,我们叫做if,我们判断一下,如果你当前的对象它属于我们叫instance of,这个我们的关键字就是用来判断你对象的类型呢,如果它属于我的P6这个类型怎么办?诶,我再强制类型转换,所以如果你这么去写代码的话,它就不会有问题了,诶,我们运行一下。
08:32
运行之后大家看一下哎,是不是就没有任何的错误了,不过大家有没有发现特别的麻烦呀,为什么麻烦?就是因为我们集合当中啊,没有约定它存储数据的类型,就导致什么都能往里面放,那么保存了不同类型的数据之后,你处理起来就会比较困难,甚至比较麻烦,对吧?诶老师啊。那既然是因为不同类型导致我们处理起来麻烦,那么让我们的集合里面添加相同类型的数据不就完事了吗?诶,这个原则上来讲是没问题的,但是我们这里语法上是没有这样的要求的,你可以在构建对象的时候,你明确的知道我全放PORT6,我不放别的,不放什么U啊之类的对不对,那所以这就没问题了,但是语法上你可以放啊。
09:15
那怎么办呢?所以我们能不能从语法上来约束一下我们集合中内部的数据类型,诶我们说泛型就可以做到,那它怎么做呢?很简单,你在我们a release这个地方,你加一个间括号就行了,然后呢,在这个间括号里面写上一个我们的PERSON6,你写完以后大家记住了,这个语法就会让我们当前的集合中只能放PRO6类型的数据,你放别的你看就会发生错误,它不允许你放别的数据,诶就这个道理。那好,还有一个问题,既然呢,我们当前已经明确了你的这个集合中只能放PERCENT6类型的数据,那么你后面根本就不用转换,为什么?因为它必须是PORT6,所以把这个给它注掉,你注掉了以后,大家看一下来,我们写上它,对了,我们这就别删除了,把这个注掉,注掉以后我们直接来list点,我们就叫做get,你会发现我们给个零点一下回来有没有发现我得到的数据已经不再是我们的object了,直接就变成了PERCENT6,为什么还是翻行啊,我明确的告诉你,我的集合中只能放PERCENT6,那我取数据不就只能取到PERCENT6吗?那么这个时候你再去往里面点一下我们的方法肯定没问题呀,所以咱们运行。
10:32
运行以后看结果,你就会发现这个就是我们当前的泛型的概念啊,泛型没有这么简单,咱们慢慢去讲。
我来说两句