00:00
好,那么关于泛刑这一章呢,我们提到了就是第一个啊,为什么要有泛刑啊,其次的话呢,在集合当中我们如何去使用泛刑,这个咱们呢也都这个举这个例子了,然后接下来的话呢,我们讲了如何去自定义泛型类,泛型接口,泛型方法,泛型接口呢,这块我们有举例子,它呢,其实还是啊接口和类的一个区别啊,我就不去举例子了啊,那么泛型这个类和泛型方法这个有一些这个细节,这个细节呢,咱们在这个order这块呢,也都提到了一些啊,咱们这个PPT里边呢,也都这个讲到了一些关于他们的一些细节问题啊,大家下来呢,可以再去看一看啊,这一页还有这一页诶这两样的内容,那相应的话呢,也会有一些这个代码来在我们这个PPT当中有些展示啊,大家都可以看一看,那么接下来咱们举这个例子,就是关于这个后续我们如何去使用自定义类,包括呃,自定义的发行类,包括发型方法这块呢,写这个DAO,诶大家呢,体会一下这样的一个应用场景,那后续呢,我们讲到这个内容的时候呢,诶大家也知道。
01:00
好哎,我们为什么要去造这个泛型类了,那么这个之后呢,关于泛型这一章,我们还有两个知识点,诶把这两个知识点呢,我们说一下,这呢,我们再去新建一个包。新包这个东西就叫JAVA2了,那这个包下呢,我们继续说剩下的这两个知识点,哎,我呢还是建一个啊叫呃,Generic的一个test。好,那泛刑这一章呢,其实我们讲了几个点,刚才回顾了一下啊,还剩两个点,第一个呢,就是关于这个范刑,我们说在这个继承方面的一个体现啊,或者叫这方面的一个说明,这是第一个点,第二点呢,提到叫通配符的一个使用,好那我们把这两个点呢,来介绍一下,这一章的这个内容呢,算是整个就结束了啊。好,首先的话呢,我们叫范型在继承方面的一个体现,呃,这儿呢,我们想说明什么问题呢,来看一下。那首先我这块CTRLC1下来这样拿过来啊,这呢,我给它变成是一个这个文档注释这样一个方式啊。
02:09
哎,在这块来说,呃,咱们呢,先从这个继承这个角度呢,先回顾一下我们前面讲面向对象的一些这个想法啊,比如说呢,我们现在有一个object啊,这是一个obj,暂时呢,我就先哎声明是个no了,我这呢有个string啊叫H72啊,这呢也是个no,好,那么我们呢,实际上是可以把这个ST2呢赋给obj的,也就是说呢,我们这是一个子类,这是一个负类,我们可以把子类的这个,哎如果你要是有个对象的话啊,把这个对象呢,我们可以赋给负类的引用,这实际上呢,是一个多态的体现。啊,这个多态体现,至少这块也体现了这种继承的这种特点啊,哎,正因为这个子类呢是继承于父类的,所以呢才可以这样去赋好,这没问题,这呢是在这个类的层面的一个展示,那同样的话呢,我们在这个数组这块呢,也是有这样的一个展示的,我这呢是一个诶数组一,我这个类型这呢是一个string类型的数组啊AR2,那么在数组这个层面呢,其实也满足这样的这个特征,诶也是对的,那这样的方式呢,也是OK。
03:17
这是关于咱们前边讲面向对象的时候呢,体会出来这两点啊,就是如果呢,我们看到一个方法,这个方法的这个行参是object类型的数组,那我们其实是可以把这个string类型的数组呢,也放进去啊,就是这呢,其实也是一种多态的形式啊,因为呢,你既然每个位置都是个string,它当然呢也都是一个object啊,也算是这种多态的一个展示啊,啊多态一个展示,那现在的话呢,我们想说明的呢,是这样的这个情况啊,大家看我以这个list为例。或者a list啊都可以啊,这是一个list,这个list这块呢,我写的是一个object,这呢叫LIST1YOU know,现在的话呢,我这个例子呢,它是一个string。
04:01
这呢叫LIST2,然后我们现在想看的就是这个啊,LIST2是不是可以复制给LIST1。LIST1,拿这个LIST2呢去赋个值。发现呢,不可以,这个不可以,然后这块呢,我们这个看一下啊说呢,我这要求是一个object,你找到了一个RI,哎说这个写法呢,有点像什么呢,有点像咱们这个这个事一样啊,我这是一个string atr,你这块呢,非得new一个date data呢,咱们指定一下U亚data,哎你看这时候呢,我们看嗯看这这样写一下吧,上边S72啊这有了,这我这样我这样啊这是一个date,这是一个date。哎,这是个date这样写,哎,T2,哎,然后这样date,你看这时候呢,我们它啊也是这样写的啊,就是这两个错误信息其实一样的,这个呢,咱们可能更熟悉一些啊,我这是一个date的一个变量,然后我赋给一个string,这呢是不允许的啊,本质上是因为它两个类型是不是完全没有子浮类关系啊对,所以不允许啊,那这个错误的信息,你看它是提示的,跟我们这个呢是完全一样的。
05:18
那言外之意。阳呢,就是我们这里边的例一和例二,它俩呢,是不具备子父类关系的是吧?哎,不具备子父类关系,那它俩呢,应该就像我们刚才下边看到的这个string和date一样,是完全并列的两个类。哎,完全并列的两类,这就是咱们要说的这个问题啊,说此时的啊,LIST1啊和LIST2它们的这个类型不具有,哎,这个子父类关系,这个大家要注意,你这里边呢是string string呢确实是object的这个子类,但是你这个类跟这个类本身是不具备这种字符类关系的。
06:02
啊,这个点呢,大家要清楚,那我们把这个事呢,先给他明确出来啊,明确出来了,我们这样说吧,说这个啊类A啊,是这个类B的一个负类吧。啊,类A是类B的一个负类,那现在咱们是怎么写的呢?我这样写的啊,这个GA和GB,这个G的话呢,在我现在举的这个例子当中,实际上是个list,那完全也可以不是list,我是一个collection,是一个a list等等都如此啊,那也就是说类A是类B的负类,那么呢,我们发现这个GA和咱们的这个GB。他们二者不具备子父类关系。啊或者换句话说呢,呃二者呢,就是完全的并列关系啊,哎,什么叫并列关系,就好比是我们这呢是一个object,你这个它的一个子类呢叫string,这有个子类呢叫做date,像这种呢,我们看到这种叫并列关系了啊就没有任何关系,说白了,所以说呢,大家在赋值的时候呢,就不能够这样的方式呢去赋啊这个要注意一下,把这个这是一个呃也是编译不通过的。
07:17
那我们这儿呢,就写到这儿啊。哎,这个编译不通过,然后下边这个呢,也是一样子的啊,编译不通过,哎这么着。啊,那么呃,我们从这个理智上呢,再解释一下啊,说这个例二呢,赋给例一呢是不行的啊,你可以列解成编译器呢,这样编它就是设置成说它俩呢不具备子浮类关系啊,那我们也可以呢,去证明一下啊,说证明为什么说这样不行,其实很多时候我们证明一个问题的话呢,你直接去证明它呢,是有难度的,哎,你要是呢,呃反着去证或者说呢,我们只要举一个反例,能够说清楚它是不行的,哎这个就很好了,哎这个呢,我们也可以考虑用这种叫反正法啊,很多时候呢,我们这么一个东西呢,都可以考虑用反正法,就是我先假设是可以的啊,就是假设咱们这个LIST2呢,是可以复制给LIST1的。
08:17
那如果要是能这样负,那你想想我接下来啊,就会出现什么情况呢,我这儿比如说咱们就实打实的去扭了一个二。List就是放。哎,就这么着,那就意味着呢,我们这是占,这是堆堆里边呢,我们又了一个release,然后这呢,你你一开始叫LIST2指向的就是它,哎,然后呢,你这块又new了一个这个LIST1啊,然后把这个二的地址给了一了,一呢也指向他。啊,那相当于这个两个这个变量指的呢,都是对空间当中唯一的一个a release实体,这里边儿我们有数组结构,然后呢,如果这样是可以的,那么接下来我们通过LIST1我去调艾的方法。
09:01
也就不会报控制人异常。那么由于你这个LIST1它呢是object类型,你想我们这是A的话,我是不是就可以添个123,嗯,那我要是填123,这个123是不是说就放到我们LIST2对应的这个里了啊,那你想想这个里边我是放string的,这里边呢,你又是不是又相当于混进来一些非string的数据了,哎,这个就导致这个混入哎非string的这个数据,哎,那这就不对了。这这就不行了啊,然后呢,呃,出错啊,那么反推的话呢,就是这样的一个假设呢,其实也是不对的,就是你要这样整的话呢,那不是白设置这个泛型了吗?啊还是什么类型都能进了成了。这个相当于这个语法设这个这个语法呢,设置完以后呢,有问题有缺陷啊,所以呢,我们就规定说像这样的它是不具备子浮类关系的啊,就是完全并列的两个结构。
10:02
啊,这个大家要注意一下,好,那么它俩呢,是这种并列关系啊,这个大家要小心一点,那么意味着什么呢?如果咱们要是写一个方法啊,Public VO啊,我就是写一个普通的方法了,这个方法的话呢,你看我这个类型,这如果我写的是一个object,我这样写的,具体这个方法体我就不多说了啊嗯,这是一个方法,这个方法呢,咱们在这受呢去调用。那你想象一下这个方法,它这个通用性实际上是偏差的。啊,为什么这么讲,你看我上边这个LIST1,我能往这放吧。是可以的是吧,哎,因为你正好是list object类型,那我们这LIST2呢,对LIST2呢就不行了,哎你要是能放,这不就相当于把LIST2呢付给这种类型的,又付给这种类型了,这不行啊,那你要是这样写不行,那就意味着呢,你如果例二呢也想做这个事儿,那你只能是是不是再写一个这个list子啊,这写的是顿的呀,哎,那就成这样了。
11:09
啊以往哎这个我叫兽医啊这样,哎这个时候呢,用这个不行,你只能用这个兽医这个方法,哎就得成这样了啊哎,这是大家需要注意的问题啊,就是我们写的这样的一个结论,哎这个大家注意啊,这个呢,清楚以后啊,那我们再说这个事儿啊说这个类A是类B的一个负类啊说呢,呃他俩呢,呃说虽然啊这样说,虽然它是它的负类,但是哎,但是他们俩不具备斯弗类关系。啊,这是一个事儿啊,然后呢,我们补充一个事儿。哎,补充什么事呢,就是这个类A,它是类B的负类,这个得清楚啊,你看我这样写,我这样写啊,说的A这个G。它和我们这个B这个类。他俩是什么关系?
12:01
对,这俩这俩首先跟上边这个区分开啊,不是一个事儿啊,这是咱们刚才说的这个事,那么换一个换一个呢,我这比如说嗯,在下边再写一下啊。那在这写一下,那在这写一下的,写一下的话呢,嗯,相当于什么呢?比如说我现在呢,是有一个,咱们拿谁举例子呀,嗯,A跟B它呢得都是具有这种泛型这个特点的,是吧,它俩是这种负类的关系,那我不想说这个负类关系了,是不是也可以是这种接口的关系。呃,是接口的关系,也就是说我现在呢,有一个叫list接口呢,其实一定程度上也算是这个,呃,像一个这种负类一样的这种情况啊,对于这个子类和实验类来讲,我这呢写一个list放的是一个string,这个呢我叫LIST1,这是它,然后呢这写个叫a list,这呢也是个string。
13:07
叫丽。哎,那么这个时候的LIST2能不能付给LIST1。你看这个时候是可以的,虽然说我们这儿不是子类跟父类的关系啊,那你要取负类,那那你那那你就用它呗。啊,这个回过来,那就改成它就可以了,诶其实一样啊,嗯呃,这个我们首先得把它导进来才行,诶这就OK了,就是它是一个负类也好,是一个接口也好,都行啊都行啊,把刚才那个我们也补一个啊这个呢,就是一个例子一二,这改成个三吧。哎,这个是一,这个是三。哎,这么着都可以,不管你是父类也好,接口也好都行,我们呢,诶把这个三呢,付给这个一,或者付给这个二,这样呢是可以的,也就是说呢,他们这种呢,是一个子浮类的关系,还是主体看是这个结构啊,跟这个结构的一个点这样子,其实呢,咱们前面已经写过了啊,比如我写一个list,我这写一个string,然后呢,我这写一个LIST4等于new,你看我右边我造的时候,咱们上午举例子的时候,其实写过这样的代码。
14:20
上午写过这样代码,右边呢,其实你不就是一个相当于它这样一个形式,然后左边呢,你不就是付给一个LIST2了吗。哎,所以这样写是OK的啊行,这是我们说的这样个点,就是你区分开,别别整混了,说类A是类B的一个负类啊,或者是接口也行,那么它呢,哎,就是它的一个负类,诶这两个呢,是具有这种子类关系的,这个呢不具备,大家呢把这个点呢明确一下就行,那其实呢,就使得呢,呃,像我们刚才举的像这样的情况,哎,这么这个我们真正在用的时候呢,其实这个相较原来的这种多态性啊,它的这个范围呢,其实要窄很多了。
15:02
啊加很多了,这个你写string跟写object这两个呢,是不可以互相哎用的啊,不能把哎像上面这个LIST2的哎付给这个LIST1的这种情况,这要注意一下。行,这个我们停一下。
我来说两句