00:00
行,那么咱们在这个集合当中使用泛型呢,就说完了,说完以后呢,大家通过在集中的使用呢,你再去体会一下,我们为什么要用泛型啊,为什么要用泛型,那么接下来呢,我们再讲一个新的内容啊,这个新内容就是第三个啊,就是呢集合原来呢,咱们说没有泛型啊,后来呢,JDK5.0的时候呢,把这个集合呢,都改成有泛型的了,那么咱们现在呢,也考虑一个事儿,就是咱们以前呢定义一些类呢,也都没有考虑泛型,那下边呢,我们看如何呢,去自定义啊叫发行类。或者呢,叫自定义泛型结构吧,这个泛型结构呢,就提到了有这样的几个,那就是典型的讲泛型类,那你要是一个接口加上一个监括号了,那叫泛型接口,那么方法的话呢,也会考虑泛型,那我又提到叫泛型方法这样的几个点,那么泛型类和泛型接口其实没有特别大的区别了,它俩的区别主要还是接口和类的区别,就是你在一个类上加个千块,那叫泛型类接口上加一个块,就泛型接口,本质上呢,就是还是接口和类的区别,就看里边你定义结构的这个事儿了,那咱们这呢,就以一个泛型类为例,咱们说一下这个它俩啊,这块我用顿号呢,我换成一个分号,就它呢是另外一个事儿,一会再说,那么泛型类咱们定义一个在这个下边呢,我不妨呢,就定一个class,我就叫做order了,我叫做这个order了,这个order呢是一个类,以前的话呢,咱们定义这个类里边的一些结构,比如说我定义死锥形的叫order。
01:34
Name说我再定一个in型呢,叫order ID,这个是非常确定的类型,那以后呢,咱们可能会涉及到一些问题,就是说呢,这个类啊,还有一个属性,但是这个属性呢,类型不太确定,那我们呢就可以这怎么着呢,我们在这儿呢去确定一下,我呢给你这个类加上一个泛型,这个泛型的话呢,我们得用个这个,这个通常是个大写的一个字符来表示了,在这里就提到通常用哪些字符啊,像这个T呀,E呀,咱们刚才看咱们都看到的什么K呀,对V呀这些啊。
02:12
KV呢,都习惯是见值,那你要是自己写的话,那就写个T,写个E都OK啊,或者写个T吧,这样写个T,那在这里边我们的相当于这个类的内部。类的内部我们就以啊类的内部结构就可以使用,使用什么呢?叫类的泛型,我们把这个T呢,就称作叫类的这个泛型啊,这是一个参数了,比如说咱们声明一个T类型的一个嗯变量,那我就比如说就叫OT吧,先没有具体说明这个T是什么类型的,这个大家要小心,这个T呢,不是说咱们有一个类啊,可不是说我现在拗了一个类,说这个类呢是T不是它呢还是一个,其实还是个参数,还是个参数行,那么我们也可以在这个构造器当中public,我写一个这个order。
03:10
呃,写一个order,然后这块呢,算是一个空餐的构造器,然后你也可以public,我写一个order,这呢是一个死阵型,哎,我这叫order name啊,In型的叫order ID,那这呢是不是T类型的一个叫order一个T啊。哎,然后这里边这点order name等于order name,这点order ID order.id哎,这次点order.t哎,等于啊,这个order.t。就是大家呢,你写的时候呢,可能以前没写过,现在看着有点别扭,你在写的时候,你倒是可以把它呃想象成是一个,就是一个内角T,那那是一个内角T,那这不就自然而然就写T了,但真实当中它可不是说某一个内角T啊,因为它这个参数咱们在实例化的时候指明这个T到底是什么类型的啊,就是你可以按照我刚才说的那样去想象,这样你写的时候呢,就很轻松了,你也可以去提供这样的一些属性的get和set方法,这两个呢就比较简单了,我们主要说一下这个T的,我们也可以写public,我写一个get方法,那就是写T呗,我就get一个叫order t。
04:28
哎,我就return一下你这个an order t,然后写一个set方法word set一个order t,这怎么写。T是吧,哎,Order t呗,哎,Z4.ordert等于哎order.t这样就是大家写的时候呢,你把它T你可以看成就是有个类角T啊,这就好写了,那事实上呢,不是啊,嗯,实际上呢,你这个参数了,那那你也可以去写所谓的这个叫图存轮方法啊,比如al shift s,直接我调一下看掉这三个参数,那你把这个信息呢,都输出一下成了假设呢,我们就先写成这样,这呢就是一个泛型类,这是我们自定义的。
05:11
啊,一个翻译类,那么定义完以后,我们去使用一下,呃这块呢,不妨我们就呃再新写一个位置吧,再新造了一个这个class啊JA JA test,那在这里边,我们这个在这写一下吧,它然后见。一。点Java行,这个我们就直接过渡到这儿了,啊这呢,来我们提一下这个发型类泛型结果发音方法这个事儿。啊,这是一个大的前提,然后呢,首先说的第一个问题啊,就是关于。哎,自定义哎这个泛型类啊,或者是泛型这个接口的事行,那么咱们呢,相当于刚才在这儿呢,我就定义了一个繁行类,那接口的话呢,你就这改成个interface,这改成是一个呃,接口的一个名字,下边呢,这个具体写的时候呢,那因为接口中不能有构造器了,这就不要写了,这个呢都是常量了啊还是呢,是我们这个接口和类的区别,我就不说接口了,那么这个我们造完以后,下边呢就可以去用了,用的话呢,我们把这个逻辑呢写在这儿去体会一下。
06:29
Word teste好,那么有了这个order以后,咱们现在呢,去给它做一个实例化,实例化的话呢,你看我现在呢,根本就没有用到这个泛型,那没有用的话呢,你现在我写一个order,点我去set一个T,你看。是不是这时候呢,就跟集合一样,你要是不使用这个泛型,他就认为你这个T呢是object类型的。哎,这不我们就看到这个情况了吗?哎,我就写个123是吧,然后呢,哎,你这个order.order啊,再set一个order t,我写一个这个啊ABC啊都可以,他认为你此时这个呢,参数是一个object类型啊这是咱们把这个点写到这吧,说如果定义了泛型类,然后呢,实例化时啊,没有使用或者叫没有指明这个类的泛型,那么则啊那么认为此类型或者叫此泛型类型为啊是object类型。
07:34
啊相当于啊,则认为它是一个类型了,那么这个呢,是不建议大家这样写的啊,那么我们这块呢,写一个这个算是要要求吧。啊要求呢,就是如果呢,大家啊,这个定义了啊,定义了这个类啊是带泛型的啊,那么建议啊,就要使用这个啊,那么建议在实例化时。
08:03
啊,要指明啊,这个类的泛型就是你定义的时候呢,都已经有发型了,那就要用上,咱们以前呢,在及格中没有用,那是因为呢,咱们之前呢还没有讲这个知识点,那讲这个知识点以后,后续呢,大家在使用集合的时候也都要用上这个泛型,那使得我们这个结构呢就更加的严格,省得呢,大家你后续呢,呃,里边呢存的都是object类型,回头呢出来的时候还得强转啊,这个反而倒更繁琐,现在呢,因为你还不熟悉,所以觉得呢不加泛型写的简单,其实呢,你写习惯以后呢,加上泛型反而是更简单啊,他做了很多不必要的,就是像原来的那个一些判断呀,对呀,对,强拽呀,这个呢加上发现以后都不用加那些东西了,实际上呢是更简单,要求更高了啊,其实更好了啊,那这块呢,我们就不建议你这样去写了,那建议呢,哎,建议带上泛型啊实例化石。
09:03
指明这个类的这个泛型啊,那这块我们就order在这个位置,你就写上,比如说呢,我们这块呢,诶是一个string型的一个哎发型类型,然后这块呢叫ORDER1,哎我后边呢扭一个哎order这个位置呢,你可以写上这个string,后边呢,就我们这个构造器啊这样来写啊构造器你看放这ctrl alt斜杠一方面呢,咱们这是有一个这个空参的。另外一方面,哎,我们看这个参数三个的时候呢,第三个第三个呢,因为咱们这个在前面已经指明了你是string了,所以呢,他会自然而然的认为我这个第三个参数也就是4STRING类型,所以你去填这个参数的时候呢,比如我这个就叫这个order AA,这是它的名字啊,1001,然后后边这个呢,呃,你可以写上它的呃,另外的呃,你想让这个string它表示的是什么意思啊,比如关于这个order的一个描述是吧,嗯,Order冒号,然后A。
10:01
啊,这样的简单的一个写法啊,对它的比如说是一个描述了啊这样个情况啊,好这呢就是我们造好了,造好这个对象以后,我们通过ORDER1你再去做这个set的操作,你会发现呢,在我们自定义发型类的方法,或者是属性啊,或是构造器,乃至于说这个这个其他的一些结构当中,只要呢,你用到了这个啊类的泛型都是你指明的这个类型,那这就是string啊,你可以给他再重新赋个值啊,比如说这不好,我直接这样说,诶诶啊,来一个hello啊这样的一个说明,呃,这呢,只能是放string类型是由于这决定的。哎,这样就OK了,那下边呢,再怎么用呢,其实这个跟咱们刚才讲的一个集合呢,就都类似了,哎,就都类似了啊这呢是咱们说的这样一个情况,那咱们在集合当中大家也能看到啊,咱们在这个list当中,我生命翻型了,然后呢,我们release呢实现了它实现它的时候呢,俄release里边那这个范型又保留了。
11:04
那这就涉及到另外一个事儿,就好比是我们这个order一样,讲下一个问题啊,这个order呢,是一个自定义的发行类,我们现在呢,哎,在实际开发中需要呢,提供一个order的此类了,我们叫做sub order,那么这个sub order呢,我们去继承于这个order,那么继承的时候呢,这块怎么处理?啊,这呢就得具体问题具体分析了啊,具体问题具体分析分成了两种情况啊,一种情况呢,就是我们在继承它的时候呢,你就指明这个具体的类型了,说我这儿呢,处理的就是专门的是叫in。啊,这就指明了,这个我要指明以后你说我这个萨它还是一个泛型。的情况吗?那就是他还是有这种所谓的发停的这个说法嘛,言外之意就是说我回过来咱们下边呢,不是我可以去造这个der的对象吧,就是你造对象的时候,你这个萨还用不用加上那个监控号呢萨,哎,就是这个位置还用加吗?不用了,因为你这个位置是不是都已经指明了呀,对这个位置呢,就没有了啊没有了这个你就直接这样写就行,哎,我叫一个SUB1哎妞一个哎sub order点。
12:25
后这样又一个他。哎,这呢,我调的是里边调负类那个super空了啊,然后你看我这个SUB1,咱们呢,去set的时候,我是从负类当中把这个方法拿过来的,哎,因为你当时父在这个继承的时候指明是inte了,所以父类里边那个方法呢,也就认为是了,所以这个呢,你再去调哎这个set的时候,哎这个自然而然的它就是个integer了。啊,这个呢,比如说你写一个1122,哎这样的情况。成啊这呢,就咱们说的这个问题啊,就是我们在这表明一下说,由于这个子类在继承这个啊,在泛型的负类时。
13:11
那这个时候呢,指明了这个负类的,呃,指明了这个泛型类型啊,那么则这个实例化这个此类对象是哎,不再需要。哎,不再需要啊,知名这个泛型,那言外之意就是我们这个泛型这个事儿呢,其实咱们刚才讲了两种情况啊,一种情况呢,就是你这个order类呢,是一个泛型类,或者是一个泛型接口啥的是吧,然后呢,我们自己去实例化的时候呢,呃,不建议这样写了,建议呢,你这时候自己实例化,你指明这个饭型的类型,另外一种呢,就是你有一个子类,这个子类呢,去继承父类的时候呢,我们也可以呢,把这个型的类型呢指明。啊,这是两种,实际当中我们去指明这个类型的情况,那你呢,是一个泛型类了,那我们这个萨博德呢,它不再是一个泛型类了,因为你已经指明了,它就是一个普通的类。
14:09
啊,就是这个样子啊,那么再接下来还有一种实际中的情况,哎,我这呢叫sub order1另外的一个类,我让这个类呢,也去继承于咱们的叫order,那这个时候呢,哎,我们没有指明啊,这种情况呢,我们其实是仿效的谁呢?仿效的是咱们这个叫a list。啊,这个类呢,你看到他继承于这个父类,它实现这个接口,像他们在继承也好,实现也好的时候呢,并没有指明说这个到底是什么,哎,我们呢,在当中同样的给它保留下来。哎,这个呢也是啊,可能出现的,说白了就是,呃,这块呢,咱们这块呢,本身啊,我想用的是它,但是呢,咱们这个呃,有了这个类的集成结构,除了list还有别的一些list,咱们呢,不是提供了一个父类吗?那父类的时候呢,也自然呢就带上一个泛型,但是呢,这个父类呢,呃出现过了我们这个子类,这块呢也没办法指明。
15:09
啊,因为呢,咱们这个真正造对象的时候,还是造的这个子类的,像你不可能像我们刚才这个sub borderder一样,在这你写说放teger,你要放teger放不了别的了,这块呢必须要用它的啊,然后呢,副类中呢,有一些结构呢,因为也要提到这个,也要用到这个E,所以呢,负类里边也还是带反形的啊,那也就是说我们这个萨点一当中,大家呢,仍然可以去保留我们这个T啊。啊,那么此时我们这个萨博德一,它是不是仍然是一个发型类吧。看它看CTRLC。仍然还是哎反行类,哎这样明确一点,就是我们对应的CTRLC这个结构。哎,他呢,就不再是反行类了。啊,这个啊行,那你要是一个泛型类的话,我们再回到咱们这个测试的这个位置,我这呢叫sub order1这个时候呢,你是不是就可以指明这个类型了,哎,比如我叫润哎,你叫哎sub。
16:15
哎,这个我叫撒巴尔吧,哎,你一个。哎,Sub order1哎这个样子,哎这呢,咱们还用了这个叫类型推断了,就可以不用写了,那么你在SUB2点我们去set的时候啊,你看到的就是一个。啊,比如我们叫A2啊,这样行不关心这个具体内容啊,主要你看这个类型,这是个string类型。成这呢,就是咱们说这个,呃,自定义发型类,或者是这个发型接口的时候呢,关于这个发型类的一个说明。啊,那除了呢,我们讲了刚才这个主要的这个情况之外呢,还有一些特殊的情况啊,一些细节的一些问题啊,咱们先把这个呢先停一下。
我来说两句