00:00
好,那就开始了,那么接下来呢,我们看是在集合当中加上范星以后,是不是呢,就可以解决我们刚才提到的问题一和问题二,那我们来说明一下,那首先呢,咱们说明呢,那就是在咱们a release当中去加入啊,我把这个代码呢,就写到下边了,CTRLC。哎,在集合中使用泛型的一个情况。我们还是以刚才说的这样的一个实际需求为例,那我们现在呢,还是有一个ear list,只不过这个时候呢,我们考虑到换行了,那么这个ear list呢,哎,A release,它你看我们这块写的时候呢,这块也加了一个监括号了,这呢就是泛型的意思,点进来在声明a release的时候呢,后边就有一对监括号,那有这个监控号呢,它就表示泛型的意,我们在使用的时候,主要呢,指的就是实例化的时候,我们去new一个a list。啊,这个时候呢,监括号里边咱们可以指定啊,你的这个泛型的一个类型,咱们这块呢,我指定为就叫做integer。
01:07
叫integer了,然后前面我们付给一个具体的arrest,这呢也是integer,就叫一个list,可能大家首先这个想到的一个事就是,呃,现在存放学生成绩为什么不能写int,对一方面呢,就是我们往这个集合里边,你加的时候,我们艾特是不是也不能加in是个类型。是个类型,你int的话呢,不在我们这个加体系下,其实是吧,当然这个还不是算主要的一个解释啊,这呢也是确实一个知识点,就是我们在使用这个泛型的时候,这个泛型是一个类型,这个类型呢不能是基本数据类型。啊,不能是基本数就行,我们呢,需要用它的包装类啊这样的一个点。这呢,所以你只能是用这个叫integer,行,这就写好了,那写好以后,当初始化,当这个实例化以后,呃,这个泛型类了,然后接下来我们再去通过这个对象去调它内部的方法或者是属性的时候,凡是凡是在当初你声明这个结构的时候里边,只要是用到泛型的位置,比如说咱们这个叫爱的方法。
02:20
在我们当中有个方法叫爱的方法,这个方法的行参就用到了我们类声类声明的时候呢,那个E啊,这呢就还是一说明,说明它们是统一的,那你上面呢,指明了E是integer类型,我这个I的时候呢,这个E就是integer,哎,所以我们这时候呢,点I的方法,你会发现呢,它只让你放integer,我们这呢,就限制了这个数据的一个飞行,那下边呢,我们去添加这样的几个数据。好就加好了,那当你此时试图向这个例子当中去添加所谓的字符串的时候,再编译时候就过不去了。
03:03
说呢,我们现在需要是一个这个这个呃,你整了一个string,这呢就不对了。啊,相当于我们把这个上面的问题就给解决了,就是能够在编译时保证数据的安全。啊,编译时啊就会啊进行类型检查。哎,类行检查啊,保证这个数据的安全,就是不是什么数据都让你进来了,这呢是我们把第一个问题呢就搞定了,那么接下来我们做一个便历,这个便历的话呢,我们还可以考虑使用增强for循环,那么此时我这呢就可以写成聚叫in,哎,这个是成绩,我们编利的是list,你会发现呢,它也根本不报错,说明呢就没错啊,也就是说我们现在取list当中数据的时候呢,呃,因为你放的是,所以自动的就知道你是了,那同时呢,咱们在第二个过程当中,咱不是说呢,想得到一个具体的一个学生的一个成绩嘛,哎,原来呢,你还需要做强转,现在呢连强转都不用了,直接呢就这样做一个赋值啊,这呢我们现在还避免了啊这个强转操作。
04:24
这个避免了强转操作,进而的话呢,你也就不会出现类型转换异常这样的一些这个信息了啊,那我们直接呢,就把这个成绩呢,做一个简单的输出就可以了,那这块我们去执行这呢也是OK的,那么第二个问题呢,解决其实主要还依赖于第一个问题,就是你当初往里放的时候呢,你别乱放啊,你别乱放呢,后边呢,这块就更省事一些了,它呢也就不用去考虑这个墙砖的事儿啊这呢是咱们用这个呃普通的呃这个一个for循环来体会的啊,那咱们也可以写成一个迭代器的方式啊,你看这个迭代器的话呢,怎么写。
05:02
这是算方式一。呃,方式二啊,我们现在呢,拿到这个list,咱们去点叫ter的方法,大家看我调列方法的时候呢,它的返回类型叫eter接口了,这个接口ter呢,它定义的时候呢,也有反型啊,也有反型,而且呢,这时候非常明确的告诉我里边呢,就是体它怎么做到的呢,然后这样回车生成的,这里边就带就有啊首先呢,你这个位置能够加泛型,是因为我们声明这个特的时候呢,人家就有这个监括号。啊,你不能是比如说咱们咱们这个造一个person啊,你造一个person,这个person呢,根本就没带泛型,你这块呢,在用的时候呢,你加减号,这肯定不对啊,能这样写的前提是你定义这个结构的时候呢,就有这个泛型。啊,一会儿咱们讲如何去定义啊,这是其一,那其二为什么你这就是个呢?是因为咱们这个方法,这个方法在调的时候呢,你看它返回的就是这个结构,由于呢,Release我们实例化的时候呢,指明你这个E就是,所以紧接着这个E呢,也就变成,所以说我们这块自动的就是一个。
06:11
啊好,那么这样以后我们接着写一个while循环啊,以ator.has next说是不是有下个元素呢?啊有,那以ator.next此时呢,这个next你发现它得到的这个数据就是一个点,我们呢把它哎同样的可以保存到一个学生成绩当中啊这个呢,你可以做一个便利,哎学生成绩这呢也是OK的啊那为什么这个位置他能知道就是一个这个这个阴这呢这呢就得看我们这个具体的阴地这了,这个阴力这呢,因为咱们刚才指明这个力呢是阴地这。哎,说错了啊,这个Twitter啊,我们得具体来看这个,这个Twitter里边这个E呢是integer啊,你看它里边这个方法,你这块把它指定是integer了,所以我这个next时返回的就也是一个integer,所以在我们这个接口也好,类也好,它里面咱们首先呢看到了,就是可以去在方法中或者是属性中,乃至于构造器当中,你可以使用这个叫类或者接口的泛型,那么当我们实例化你这个类或者接口的时候,凡是下边用到泛型的位置啊,你这指定的E的类型,下边这个类型呢,就都变成你这个类型了,这是我们通过刚才这个集合的一个演示看到的这样一个情况,一会呢咱们总结啊,这呢是咱们举的一个关于release的一个例子,把这个音节这呢跑一下看看。
07:42
OK,没问题,这呢是我们使用的这个情况啊,这呢是以啊a release举例子的,那接下来呢,咱们再举个例子啊,那么我们开发中常用的呢,还有一个叫哈希map。那哈西麦克呢,贝利,行,那咱们再写一个。
08:09
来public VO test3好,我们看一个哈map,现在呢,我去这个用一个哈map啊,这个map呢,我哈map呢,我可以给它复尾这个map了,这里边就看你想放什么类型了,比如说呢,这个键我就想是一个string型,值呢是一个类型,哎我这就这样写,在这个map呢,稍微特别一点,它呢因为涉及到键和值俩,所以呢这个监括号里边就有两个。我们去new一个叫哈希,哎,Map,你看这样一对加括号啊,一对小括号,在这里边写上这个string啊in,好,这样这就写好了,那么之所以能写俩,还是因为人家声明的时候呢,就是声明了两。哎,声明俩,所以呢,你这块就得写俩,生明一个就得写一个,生明三个就写三个这样行,那么接下来我们通过map点我去调铺的方法,我们会看到它的key和value,就是我们指定的这个string和integer,原因还是那个道理啊,我put进来,我这个呢,K就是K类型,Y6就是V类型,K和V就取决于咱们哈map,当然这个哈,Map呢,它也是带反型的,取决于他在声明的时候。
09:26
这还找不着了啊,走啊,声明的时候人家是有这个K和V,当你实例化的时候呢,指明K和V的类型,下边这个方法中的K和V都是你指定的这个类型,所以我们这呢往里边去放啊,比如放一个Tom啊,这个呢是它的一个啊,比如说还是这个成绩啊,我们就往里放,这是放了一个了啊,接着你再放其他的几个Jerry。哎,这看是吧,哎这个呢是它的一个成绩,诶A啊指定也也可以相同啊好,这样的话我们就放了几个数据,当你试图放其他类型的时候呢,那很自然而然的,它就不可以了,这呢是因为咱们Java这个语言啊,这个是一个强类型的了啊,你这写的string你就得放string,写的inter呢就得放inter啊你这想写个123,哎这呢想写个这个,哎后边这个Y6想写个ABC啊这个呢都不行。
10:20
啊,因为呢,不满足人家这个呃方法的一个形态的要求啊,这个就错误了,行这呢我们是往里放的,好,那接下来咱们像取我想取了啊取的话呢,咱们不妨呢,就使用一下这个先获取一下一个entry啊这块呢就稍微有点复杂,大家注意看我呢现在调这个叫entry set,其实你也已经看到了它的返回值类型,这是反类型,看能不能看得懂。我entry set,首先呢,返回是一个set吧,这个set呢也带泛型了,那就监括号里边就是指定的是你这个set里边到底放的什么,咱们放的是不是n tra啊,哎,那就你写N垂,那这个n tra的话呢,它也是一个泛型的一个结构,那n tra呢,它的这个泛型就是指明你里的K和Y6到底是什么类型,咱们K是string y6是in,哎,所以呢,就得这样写,哎这个写法呢,其实它是一个泛型的一个嵌套,咱们自己啊再分析一下,写写啊,首先呢,返回的是一个set set里边呢,你放的是ENT trade jt垂的话呢,因为没有直接对外暴露,大家也可以写麦和点ENT trade啊,然后呢,这个ENT trade呢,人家也带泛型了,它的泛型呢就是指明它内部的这个呃,数据的K和VALUE6的类型,那K不就是string y6呢,是integer嘛,所以呢,就这样写。
11:41
这呢是一个N垂,哎,这样接收。哎,这样接收啊,大家理解一下这样一个过程,这呢其实出现了一个叫泛行的嵌套,哎这个呢,没什么难点啊,就是你里边什么类型你就写呗,写完以后呢,你这个里边还有还有那就直接加就完了,就这样,那关于这个点呢,也有同学问过哈,说这个map点的这个事儿,因为咱们的NRY呢,它是一个内部的接口。
12:08
不是像map一样直接暴露在外面的哈,它是定义在map里边的,就像咱们当初讲类不类的时候,咱们不是形象点,我这造了个person类,Person类里边造了一个dog类,这个dog呢,是在我们person里的一个内部类,那你要想用dog的位置。是不是都得点一下,哎,得这么着才可以。啊,这是它的这个特点啊,那有的同学呢,说能不能把这个map点省了,或者说你看到别人写代码的时候,把这个map点省了,这个省呢?哎是你上边基于有一个import是吧?哎,java.YouTube下的map点我写一个星。哎,然后接下来你看这个entry就可以不用加了,哎,这样写的前提是因为你上面写了一个inport啊,你要没有写的话呢,这个你写全了,那其实是map点,而这个呢,咱们倒了,哎呦,点到这来了啊map的话呢,我上面这不写了一个YouTube点行吗?
13:07
把它给倒了,嗯,行,这就是这两种两种写法啊,两种写法都行,这不是一个大事儿,嗯,这样的话呢,我们就得到了一个entry,这个entry下边呢,我们对它进行一个遍利啊,首先呢,拿到这entry点我去调好调eer,下边咱们还是来分析,这首先呢,得到的是一个eter,那么eter里边放的呢,就是。嗯,这个ER里边放在那是不是就是你到底要便利的这个数据是谁啊,便利的谁啊,是不是还是map.entent呢,又是兼值又是string和实际上就是它呗这样。这样啊,当然大家写的时候呢,你不一定非得像我一样,我只是让大家呢,就是分析一下啊,你要写的话呢,你直接在这个位置你就out enter一下,这不就直接搞定了就是吧,只是说我们自己写写,让你体会一下它到底为什么是它啊,然后接下来挖一下。
14:10
啊,e.has next,这还是一个波形,然后接着呢点next。Next al是他理解吧,那你知next不就返回你里边这个entry啊,上面我啊在这叫了这个N了啊啊,那我就叫一个E吧。呃,我调了个ne方法,相当于就是取出我们这个呃eter啊,它里边的这个具体的一个数据了,这个数据不就是一个N税嘛,就是个它啊就是这个E,那接下来的话呢,你就比如E点,哎,我们呢去get它的一个key k不就是string类型的嘛,这不就是那string的个key,然后e.get这个VALUE6啊VALUE6呢就个in inter尔类型的,就是完全基于泛型,哎我们这个数据的类型呢,就完全的是确定的,哎我们K加上一个直向,哎我这呢就简单写个Y6啊,那么这个K和V咱们有可能呢,回头你需要把这个数据呢,装到一个对象上啊,那装的时候呢,人家这个对象啊,这个key和呃对象的属性呢,都是明确了,是string啊,是in啊,所以这块你不能泛泛的就写成object啊,那是不太合适的行,那么通过这个例子,咱们稍微复杂一点啊,又说了一下这个泛型的使用,稍微呢,简单做一个总结啊,这个我们写到这个上边吧,啊,这是第一个点。
15:37
啊,它的一个新特性,第二个呢,我们说在集合中。使用这个泛型来咱们做一个总结啊总结那么首先我们集合先写,这算一个小点吧,这个集合接口或集合类。
16:00
在JDK这个5.0时。啊,这个都修改为泛型的,这个结构都修改为带泛型的结构,这呢是一个大前提,也就是说呢,我们像哈奇map啊,包括这个ter,包括release,我们看到呢,就是它首先呢,你这个结构的声明这块呢,它一定得有这个泛型啊,你有泛型才可以去用啊,我普通的定义这个person根本以前都没有写过泛型,你定个person后边加个监号,那肯定是错误的啊,所以第一个呢,就是首先呢把它们修改为带泛形态结构了,然后第二点,第二点呢,我们在实例化。啊,在实例化这个啊,集合啊,类食啊,可以指明具体的这个泛型类型,注意这个泛型呢,它指的是一个类型,它不是一个变量名啊,是一个类型名,就像我们说这个变量的话,数据类型变量名等于一个变量值,它放的不是这个东西啊,它放的是这个类型,嗯,我们可以在实例化的时候呢,指明泛型的类型,那么指明完以后啊,这来一个三。
17:15
啊,殖民完以后。啊,然后呢,在这个集合啊,集集合这个类啊,或这个接口中,凡是。啊定义啊,类或接口时啊,内部结构使用到类的泛型的位置啊,这个呢都指定为。啊,指定为你实例化时的这个泛型类型啊,那么比如比如呢,咱们就提到这个爱的方法,爱的方法呢,它里边写的是E类型的一个小E,那么真正当你这个实例化以后。就是造对象以后,哎,那么这个时候呢,这个爱的方法呢,它就可能不是一个,它就不是一了啊,你上面指定的呢,是E是一个integer,我这呢就变成一个integer了,哎就成这个意思了,那么其他的这个也一样,这个内部结构的话呢,我们这个呢,很丰富啊,说比如呢,像这个方法呀,构造器呀,这个属性啊等等,哎都如此,凡是呢,你在定义这个呃,内部结构的时候呢,你使用了这个类的泛型,那么在实例化以后呢,哎,都指定为你具体这个实例化的这个泛型类型。
18:37
好,这呢是我们说的这个问题啊,哎,那么再说一个这个四这呢需要注意的点,注意点呢,就是我们这个泛型的类型啊,泛型的类型呢,说必须呢是一个类啊啊,那么明确呢,就不能是基本数据类型啊,那么我们需要啊用到这个基本数据类型的位置啊,那么需拿咱们的这个包装类。
19:09
来替换啊,这个也非常简单,能能理解,那么这是我们说的这个第四个事儿啊,然后第五个事儿就是咱们原来在讲集合中使用泛型之前呢,呃,咱们呢,就直接呢这样去拗了,好像呢,代码也没什么错。啊,咱们在这个idea当中,大家看的比较干净哈,没什么错了,如果呢,你要放在这个eclipse当中,这块呢,它会报一些警告,警告呢就说你没有使用泛型。哎,毕竟呢,咱们定义的时候呢,是有发性的,你也没使用它就警告一下你没用,但是呢,其实警告也不等于错误啊,就是你可以不用啊,也可以不用,那不用是什么情况呢?这里边我们就提到一个点啊,说如果实例化石像咱们以前就是这样做的,没有指明泛型的类型,说白了就没有用泛型啊,那么我们默认啊这个类型为。
20:05
哎,咱们通过添加那块不也看到了,是不是就object这个类型啊,哎,咱们原来这样写,你看我这没有用反省你这块艾的时候呢,他不是都认为是一个object吗?啊就这个意思,好这呢是关于我们集合当中使用泛型大家的一个理解啊一个理解,那这个呢,如果能理解了,大家呢,你考虑一下谁呢,咱们呢,讲这个前一天练习的时候呢,就是把这个学生成绩,哎不是学生成绩把那个user。不是user employee是吧,把它呢,是不是都放到这个吹set或者吹map当中是吧,咱们讲吹map时候也举过这个例子了啊,然后你放在这里边的时候呢,其实这个结构呢,也可以考虑给它改成是一个泛型的一个情况。啊,一个泛型的情况,那这时候泛型呢,它就涉及到谁了,不管是我们这个吹set了啊,Set这块能加泛型这个compar这个结构呢,你看它也有泛型,它有泛型它呢,进而决定了它内部的这个抽样方法啊也是。
21:08
啊,一个T类型的,那当我们去new这个comp对象的时候呢,其实这块呢,你就不用让他呢设object类型了,也不用在里边呢,先if谁谁谁instance of谁的直接的这块呢,都是确定的类型,好这个我们先停一下。
我来说两句