00:00
行,那么通配符啊,只是呢,这样一个最普通的一个通配符呢,我们就讲完了,那讲完以后呢,按说就结束了,但是下面呢,还有个普通的一个知识点,就这个通配符的话呢,我们还有呃,另外的一些变形啊,叫有限制条件的通配符的使用。这个往后走,这个咱们刚才讲的就是这样的一种情况啊,有读取和写入,这个咱们已经说过了,然后下边呢,嗯,例子当中说呢,叫有限制条件的这种通配符,嗯,就是通配符的话呢,除了我们能够看到这样的一种情况之外,还有可能会见到这样的一些情况。见到这样的一些情况,这里边儿呢,下边两个,呃,第一个和第三个其实算一种情况了啊,就是有一个问号extend某个类型,问号呢,Super某个类型。把这个呢,我们说一下,这个我们说一下,那我就在下边写一个三得了啊。呃,有写个三,呃,有限制条件的,哎,这个通可出的一个使用,哎这么着我们去说明一下这个问题,那有限制条件的这个咱们在这呢,去这个举这样一个例子吧,我呢去造一个类啊,这个类呢,我叫一个person类,具体细节就不写了啊,然后呢,我去提供在一个此类叫student啊student让他去extend。
01:33
咱们的person OK。行了,然后回过来,回过来以后呢,我们现在呢,在这个演示的时候呢,我们去写这样的情况啊,然后这个问号呢,叫extend,哎,我这写个person对它的理解,还有这个问号呢,叫super person这个的理解,那咱们还是以这个list为例。
02:04
给撕了,哎,这样啊,哎以这个list为例,现在呢,我写什么呢?哎,我写一个list,这个list呢,我们这个写成叫问号extend person。这个呢叫LIST1,然后list叫super person。叫LIST2。行,这呢,其实呃,在某种程度上也是负类了啊,你看这个你的子类都可以有哪些,咱们呢,提供几个一般的情况,比如说我这呢,就写成写成一个person的一个子类的啊,这叫student,哎,这个呢,上面叫一二,我这个叫三,哎这个呢,我再写一个比它大一点的就是person了四。比person再大一点的object。
03:00
五好,那现在呢,我们想看一下,就是345分别呢去付给LIST1啊,再分别呢付给LIST2,看看是否允许啊,那么先看这个LIST1,拿这个345去付。好写完了,那这是关于这个类一的情况,那能看到的就是最后这个是不允许的,我这个不行,前面两个都行,那么我们总结一下,就相当于它可以作为咱们这个结构和这个结构的负类出现啊,负类出现那么我们怎么去,呃,稍微形象点去理解呢。对,这个问号就是一个不确定的一个范围是吧?哎,这个范围的话呢,Exces就是你呢,是可以是person的子类,哎,这不正好它是,那恰好呢,它还不光是子类,还可以就是它,哎,就这样理解,或者大家可以把这个ece看成是,是不是叫小于等于啊,哎,这样的就行看成小于等于啊,那它要是小于等于,那我们再看另外一个。
04:12
LIST2。行,那这块呢,我们看到这个student是不允许的,后边这个person和object是允许的。就是你最起码是个person,然后可以比person大是吧,那这个时候呢,把这个除置掉,说明呢,就是它可以理解为叫大于等于,哎,叫大于等于行,那么稍微总结一下,你想想我们这个问号大家呢,其实可以把它想象成数学当中的,呃,就像负无穷到正无穷一样,呃小到的话呢,任何一个非常小的子类,大到呢,大到其实这块呢,没有完全指明了哈,虽然说你超不过,但是这块我没有指明,没有一个界限啊,你可以这样去理解,那么这个呃问号呢,叫extend啊,这个extend我这写了一个类型A,它就相当于你是可以从负无穷到这个A,相当于它有个上接,哎,你这个问号呢,去super。
05:18
啊修复A,哎,它有一个下接,哎这块呢是无穷的,诶可以这样形象去理解,这叫有限制条件的一个通配符的使用啊,哎简单的在这总结一下,这样我们说这个以这个list来举例啊。嗯,或者不用list,我就直接写个这个G也行啊,说这个,嗯,我这呢也不用这个super了,我就叫A,这个也叫A啊,对于他来讲,我们说这个G啊问号写一个通俗的一种解释,Extend,这个是A,它呢是可以哎作为咱们这个GA。
06:02
啊和我们这个GBA它的这个父类的,那么其中咱们这个BA啊是的子类。能看懂吧,对这样个说明啊,那么对应的我们看一下这个事CTRLC。哎,此时呢,我们把这个exce呢,换成这个super,哎这种情况它呢可以看成是JA和JB的啊,负类的啊,那其中的这个B,哎得是A的一个,哎,负类。哎,这个样子。啊,这个D就不要了啊好,那这呢,就我们说的这叫有限制条件的一个通配符的一个使用啊,通配符一个使用啊成那这呢就算说清楚了,那升出以后,咱们上面呢,讲这个障碍符,呃讲这个通配符的时候呢,说呃这个是最通用的这种情况啊,或者范围最广的,它呢是不允许往里边写,只能写个闹读呢,读可以读,那你想我们下边这个呢,能能读吗?
07:10
我这个LIST1LIST2我能读出去不。是不是肯定可以啊,可以读没问题啊,读肯定是可以的,能理解吧,对这这没啥可可难理解的是吧,读是OK的啊,读的话呢,你要说的话呢,这个呃,这个写一下啊,关于这个读数据。读取这个数据啊,读取数据咱们先看一下这个叫LIST1吧,这个LIST1啊,这个咱们这实际上没有这个具体的这个去实例化了哈,我这要调其实是有风险的。对吧,那那咱们怎么着呢?我把这个位置给他扭一下吧,Still,行,这么着一下。
08:10
行,具体里具体里边呢,我没有写数据啊,那至少呢,我们保证这块你别出现这个控制人的问题了,这个LIST1咱们呢是这两种呢,都可以去复制的,那那随便挑哪一种都行哈,比如说呢,咱们这个例色一,我这块呢,临时的再去给大家强调一下,我就写了一个三三啊写个四吧啊其实都可以啊,哎,我现在呢,是拿它付给了咱们这个LIST1,那我现在LIST1哎,我去,哎这个叫get数据。啊,例一我们去get可以获取某一个索引位置上,比如说就零吧,诶我去获取这个位置上数据,那大家说我这个类型这块怎么写。写object行吗?写object肯定可以对,那我们现在要想的就是能不能小一点,可以写person吗?诶这个呢,诶注意你看person也是OK的,这个得能理解啊,就是这个例一,咱们这不叫小于等于吗?哎,所以说你不会超过person,所以我们用person其实接受就OK是吧?哎,这个是行的啊,那我这个呢,拿这个三去付。
09:23
拿三副跟拿四副其实都得写person,或者都能写成person,你这块想写student是不是不行啊?对吧,虽然你这块呢,这是student,但是呃,我这呢,主要是看我这个例子,我的声明啊,我呢是小于等于person,所以这个位置呢,最小也只能写到person了,对你写这个student呢,这是不行的。1.get啊,这零一下,这不行啊,这是变异不过啊。哎,这个要注意一下,这呢是我们关于这个LIST1了,那你看一下谁呢,你看我这个LIST2啊,这个LIST2呢,我拿这个四呢,去复一下值吧。
10:08
嗯,然后呢,LIST2LIST呢,是长这个样子啊,它呢,我拿这个负的值,你说我这时候get的话,对我那去get一下,我写个零拿谁接受啊,对对,只能写object,嗯,因为呢,这时候你是大于等于person,它可能还是person的负类的,所以这个位置你想写person person是个最小的情况了,这肯定不能写person了,哎所以这样呢,你看写完以后呢,哎这块他也就会报错了,哎这是一个这个错误的情况。这个不行啊,这呢只能写成哎,Object。像这些细节的话呢,其实大家不用去死记硬背,就是你能够去理解这个事儿的话呢,自己写代码的时候呢,诶发现诶不行,你能够解释啊就可以了啊不用说呢,去非得把它记下来,这样这呢是咱们说的这要读数据了,那么写入数据呢,写入数据呢,咱们在呃上面这种情况使用的时候呢,说只能是写个no。
11:13
这个这种情况啊,说只能写个闹,那现在咱们来看一下这个这俩哥们写数据这块呢,有没有一些点,比如说说他。这我能往里写数据吗?就是非闹的啊,非闹的数据能往里写吗?想想。比如说我想往这里边写一个student,哎,我去爱呗,爱里边我去new一个student。发现你看不行是吧,能解是吧。就是我这个呢,问号咱们刚才说了,是不是表示叫哭穷是吧,你可以这样去理解啊,这是这个person就是呃,你要写个student,那我万一这个范围比student还小呢。
12:11
万一我这个问号代表的是一个比student还小的,你传一个副类不对吧?能,能转过来不,因为子类可以付给父类,父类不能付给子类,我扭了个student,那有可能它是作为我这问号是负无穷,我特别小,你突然呢,整个student,那我这个问号很小,你怎么能把右边的负给左边呢?因为右边不是负类嘛,哎,所以这样是不允许的啊,这要注意它呢,BA不通过。行,这是不行的,那么咱们看下这个LIST2,这个LIST2呢,我往里边去艾,LIST2长这个样子。对,这个能往里写谁啊,哎,我们去new一个person,那person可以,我能往里边new不随份可以不。
13:04
都能用了student,那不就更可以了吗?你看哎,就是你对这个其实理解了就行,理不用大家死记硬背啊,我这个呢问号,哎,这个大于等于了啊,咱们说呢,你最起码是一个person了,然后呢,这边呢是可以是一个正无穷的哈,你不确定的了,现在呢,呃,你最起码你这里边呢是能装person的,那我用个person这不肯定可以,Student的话呢,是person此类多态的形式不更可以吗?啊,但是你要说我我person的一个负类,假设它有一个显示负类,你要去用这个负类的对象往里放,是不是就不行啊,因为有可能是person跟这个类之间呢,万一我问号是这个之间的某一个类呢,你你又放了个父类呢,又不行啊,这呢你有个底底是person,所以呢,诶person和person的子类呢,都能往里放。啊,就是这种,当然这个的话呢,大家诶你能理解这个事儿就行,用不着死记硬背了,就是能够用面向对象去解释的这些问题呢,哎,你就能够解释清楚就OK啊,这个是可以编译运行都过的啊,这个是没有问题的,那那后续的话呢,如果你要见到了类似于这样的这种结构,哎,我往里边填数据的时候呢,你别惊讶啊,哎,那可以加,因为这个是大A等于,所以我填个person也OK啊是行的好那么讲到这儿的话呢,咱们关于这个内容呢,就都算是就结束了啊,关于泛型的使用这块,嗯,这个后续的话呢,这有两个这个应用这块呢,两个小的题目,这个大家呢看一下就行,这个第一个呢,叫泛型的嵌套啊,你把这个代码呢,粘出来放到我们的这个编译器当中看一下就行,想说明的问题咱们在早上其实也见过,就是咱们在遍历这个map的时候。
14:56
便利map的时候呢,咱们也看到了这种嵌套的这个情况,这呢其实就是一种嵌套,只不过这个套的呢,咱们也就套了两层,那这块的粒子呢,套的这个层数呢,可能就更多了,这呢套了一层,这又套了一层,外层呢又套了一层。
15:14
啊,稍微复杂一点,但是呢,你只要捋清楚就行啊,这是一个,另外一个呢,就是一个实际的应用案例,说我们呃,为什么要用泛型,就是因为有这种不确定性啊,像我们这个课后这块呢,这个题目啊,哎,直接呢,我们定位到这个核心代码这块,说这呢,我写了一个叫person啊,T extends in。啊,Extended infer这个题引注意,我写的不是问号。问号呢,是一个呃负类的那种形式的啊,这个T呢,你就得写一个具体的情况了,呃这块我们在这个呃泛型类当中使用了这个T。这样的情况,我们呢,下边去利用你这个person的这个对象。用列对象的时候,我们这时候这个T这样写的意味着着就是你这个T去指明这个类型的时候呢,必须是这个infer的子类,或者叫实现类,那就看你这个info是什么啊,咱们这info呢是定义为一个接口了,那就是你只能是放它的这个实现类,你要么呢放contact,那contact要么呢就放这个introduction,所以这呢,我举了两个例子,第一个呢,我放的是contact,第二个呢,放的是introduction。
16:22
啊,就是体现的就是我们里边呢,这个类中的这个属性是不确定的啊,这呢就是一个泛型的一个应用场景啊,其实也不困难啊,大家呢,听我这样一说,哎,明白了就不用下来再去看了,那么关于咱们这一章泛型呢,整体上就是这些内容,那么后续咱们在开发当中,如果大家看到相关的一些类啊带泛型了,那我们可以考虑呢,去使用上这个泛型。啊,同时呢,我们在后续讲数据库操作的时候呢,咱们也是有可能来自定义这个反型类的啊,就这样就OK了。
我来说两句