00:00
那刚才呢,我们说的就是这个后续咱们在开发当中,大家呢,可能会去定义啊,这叫泛型类了,那定义的时候呢,咱们就是刚才我以它举一个例子,哎,大家来体会一下这个事儿,一会儿呢,咱们再举一个实际问题啊啊然后呢,实际开发当中呢,有可能这样做啊,也可能是这样做的,这样子做的,这个大家呢,也去理解一下,然后呢,除了这个之外呢,还会有一些小的细节,这个细节的话呢,咱们来看一下这个PPT。诶,看下这PPT啊,然后我们就从上往下这个顺序呢,带着大家过一下啊,第一个说泛型类呢,可能有多个参数啊,你要有多个参数的话呢,你就写多个就完了。咱们刚才举的例子是不是就一个呀。咱们刚才举的order不有一个吗?啊,那么咱们看到在这个map当中。Map里边呢,它有多个了,多个的话呢,中间有个逗号隔开。那你要是布置两个三个甚至更多。
01:02
就用逗号隔开就完了,这个符号的话呢,你可以自己想着叫就行,你要说这个一会这个叫T,这个叫一,这个没有那么多词汇量,你就叫111213也行。那以后呢,咱们是有可能见到啊,有这个多个泛型参数,那有几个你实例化的时候呢,是不是就填几个呀,对的好,这是一个,第二个就是我们定义这个类的构造器的时候啊,这个范围类的构造器的时候,这个像空餐的这样定义,你不要在这里边再加一个一了,你看我这块,我定义这个order构造器的时候,不就这样写的吗?我可没有说在这个位置我能再整个这个键括号啊。这个没有整,但是呢,在你实例化的时候。但是在实例化的时候呢,这个位置得补上,补上一个是吧。实例化的时候这块给补上一个,就是这个声明构造器的时候呢,不要加啊不要加。那这是一个,然后下一个说实例化以后操作原来泛型位置的结构啊,必须呢与指定的类型一致啊,这就相当于你实例化了,里边呢,方法是那个E的是那个T的,哎,就指定为你现在声明的这个类型了,下一个说叫泛型,不同的引用不能相互赋值,这个呢,其实我们在后边呢,呃,讲继承这块呢,也会提到这个事儿,把这个呢,咱们去说明一下。
02:22
这个想说的是这样一个问题,比如说啊,我现在呢,有一个a list。Ear呢,这个位置我写的是个string啊,我这叫LIST1,哎,我暂时呢,这块是个no这个事,然后现在呢,我有个ear啊啊是一个integer,这呢我叫例二啊,我就写no。哎,想说什么问题呢?就是原来的时候呢,咱们说这个你是一个list,我也是个list,既然咱俩都是list,我这个LIST2呢,是不是可以考虑复制给LIST1啊,嗯,这个啊,对,就是把这LIST2复制LIST1,因为咱俩类型一样啊,是吧,就像以前的时候呢,比如我们在这里边啊,先暂时的给大家去写一个,比如这个person吧,啊先放到这啊,以前的时候呢,我们说我这定一个person叫P1,咱们写个no,然后我现在定一个person叫P2,也是个no啊,当然你可能有具体的值,我们主要想说的是这个事儿,咱们这个P2呢,是不是可以付给P1啊。
03:24
哎,因为你这大家类型一样,但现在呢,这个要注意这个事儿就不行了啊,就是我们的LIST1LIST2虽然都是a list,但是此时LIST2不能付给LIST1 list1呢也不能付给LIST2,它俩之间是不可以相互这样负的。这要注意。这个事儿好理解不?嗯,对,咱们指明了,你像我这个LIST1里边是不是艾的时候只能艾特string,你这个呢,只能艾特,你要这样付假设能成,是不是相当于如果啊,如果你这个位置呢,实例化了。
04:08
哎,你实际化的时候呢,你这个位置不就是integer吗?言外D呢,就是你这个LIST2里边只能填inger,我把这我的这个引用地址给了你了,那不就成了说你这是LIST1,你是LIST2,咱俩指向了对空间中的同一个release,我这呢要求是只能放,但是你这个LIST1呢是string,你调爱的方法呢,是不是给我就扔进去string了,这不就出问题了吗?哎,对啊,这个大家要注意啊,就是这个时候呢,它俩呢就不能看成是都是呃a release去赋值了啊,有这个区别啊,行,这是这个问题啊,虽然说咱们在这个运行的时候啊,在运行的时候呢,把这两个呢都看成是release了。但是呢,这是运行,那我现在是编译编译过不了。啊,就像说这个,呃,这个这个我爸是局长是吧,但是现在呢,你出交通问题呢,现在是在一个普通的交警这块出问题了,还没到你爸那能管的事呢是吧,这块呢就过不了了,哎,该判还得判是吧?哎,该罚还得罚,就是先编译后运行,运行呢好使,但编译我不好使是吧?编译不让你过啊,诶这个问题注意。
05:21
嗯,然后呢,在下边说,如果这个发型你要不指定的话呢,这个相当于类型呢,就被擦除了,咱们就按照object去处理了。啊,但是不等同于object,这个咱们后续再说啊,这个大家呢,先知道是认为是object,其实还有一些区别啊,在继承方面的一些区别,在下面这个经验呢,就是说大家呢,如果你看到一个结构它带泛型了,大家呢尽可能就都要用。啊,我这说的意思就是说,你要么一路都用,要么一路都不用,你别那用着用着突然就没了。啊,当然了,主要的要求是大家呢,既然你看到这个结构有泛型,那都要用上。更严格一些啊,在下边说,如果泛型类呢,是一个接口或者抽象类,这个写的就有点问题是吧?啊,如果这个泛型结构哈。
06:11
哎,都写了是个泛型类了,它也不可能是个接口了啊,如果这个泛型结构呢,是一个接口,或者是抽象类呢,就不可以创建泛型类的对象,这个点呢,不是新知识不能造对象,还是因为它是这个事儿是吧?哎,这就过了啊说这个1.7的时候呢,咱们可以简化处理,这就是一个类型推断,哎,咱们讲过了。在下边说呢,你要是基本数据类型的话呢,咱们得用包装类去替换啊,这个也说过了,然后再看后边这个啊,这个呢提到一个九这块呢,还提到一个十啊说呢,在我们这个泛型类或者是泛型接口上呢,静态方法中不能够用类的泛型。这个呢,我们要注意CTRLC演示我们在这个order当中。这是咱们自定义一个翻型类啊,我呢写个方法说public word,我写个收方法,在这个收方法当中,比如咱们就简单的我把这个叫order t呢做了一个输出,相当于我们调用了一下这个类型啊,那么怎么办呢?我这个方法呢,我static一下。
07:16
哎,这么着写的,你看这块呢,它就报错了。这个报错了,或者我们再形象点让大家去体会呢,比如说我这儿呢,我再去传一个哈,哎,T类型的一个,呃,叫order t,相当于这时候咱们要输出的话呢,输出的就是这个行参的这个o.T了,他这块呢报错了。这不有这个红的是吧,哎,那你想这个为什么不行,哎对,哎大家说的是对的啊,这个呢,从咱面向对象的角度就可以解释了,咱们呢,说这个类的泛型。咱们是什么时候指定的,是不是造对象的时候啊,这就实例化的时候啊,而我们这个静态结构呢,是不是它要早于对象的创建,对就相当于呢,你这个类型还没指定呢,我这块就要用了,哎这不行,哎所以这个呢就是错误的啊,诶这个大家要注意一下这个事。
08:11
这是这个问题啊,那接着呢,还有一个事儿呢,就是呃,提到这个异常类,它不能够是反行的啊,就是说咱们比如说啊,我造一个叫MY啊exception说呢,让这个呢,你这时候你加个型,你你爱怎么加你怎么加。此时呢,你是继承object的。啊,没事,但是呢,你说我让他去继承于这个叫exception。说exception呢,是我们这个异常的一个体系,那现在呢,我让它呢,是一个异常下边的一个结构,此时的话呢,我们就不行,你看我这要把这个体去掉啊,这不就OK吗?啊加上这就不对。啊,也就是说我们这个异常类不能够是泛行的啊。啊,异常类不能是啊,不能声明为啊这个反型类啊,这是这个,那同时的话呢,你像你这个一个方法里边,比如我这写一个普通的方法word啊,比如我就还写这个叫收方法,在这里边呢,咱们可能会处理一些这个有异常的代码啊,在这个位置上你写一个这个啊catch。
09:20
哎,开始说呢,我上边那个T呢,哎这个T呢,我回头就让他表示是一个异常类啊,异常类啊,你这块呢,我就写成个T类型的一个小T,哎想这么着,哎这个也不行,这样写法也不行,就是在异常这块,你万万一要写的这个T不是个异常的一个类型,这不就过不去了嘛,是吧?哎,所以这呢也是不可以的啊。看编译不通过行,这是我们说的这个问题啊,这两个事儿,然后下边这个事儿的话呢,这个稍微大家呃去留意一下啊,这个呢,相当于是格外你需要关注的一个点了啊,就是很多时候呢,我们其实也用不着,但是你要用着的时候呢,大家稍微注意一下,呃,什么意思呢?这个我们啊,行,那就都写到这个order里边吧。
10:09
Order呢,这是它的一个构造器,那不妨呢,我在这个构造器里边呢,去做一个说明啊,嗯,怎么着呢,我现在呢,想声明一个T类型的一个数组,我生明一个T类型的数组,这个数组的话呢,这个怎么写?啊,这块呢,你要说你一个T长度是十,这呢是错误的。这个不可以啊,这个不行,编译不通过。啊,那你可以怎么写呢。你可以这样写啊,我去new一个呢,叫object类型。你个不这个类型,然后这块呢,你写个十,哎,然后这么着,然后这块呢,你可以做一个强转这样这样虽然说呢,那个编译倒是过了,但实际上呢,你这块呢,New的其实还是这个object类型的这个数组,数组的话呢,声明是它你具体放数据的话呢,你必须得放这个T和它的子类的对象,这个时候呢,才能保证你这个呢,实际执行的时候呢,不会出问题。
11:12
对吧?啊,这可能有点绕了啊,就是我们这样呢,你有首先不行啊,大家写代码的时候,你知道这样过不了,因为这时候呢,New t,呃,这个T已经非常具体了,相当于你是一个实际的操作了,只有是一个类就叫T,你才可以这样去扭,我们这的T其实还是个变量嘛,是个参数是吧,是你实例化的时候呢,指明这个参数的一个类型而已,只不过这个变量呢,是拿一个类型来充当的,你不能这样写,你可以这样写,然后我把你转成一个这个类型的。啊,你要想这个事儿,这个回头我们编译运行都不报错,那你回头用这个的时候呢,你你这块每个比如AR,比如说你角标零,你真正给他去附个值的时候呢,是不是只能是new的T或者T的子类对象啊,这样这块呢,它才不报错啊,你别在这真new object,那这不就出来这个类型转换异常了吗。
12:06
枪战不就出事了吗,是吧?这有点晕哈,你你就注意上面这个,你要想去造这个T类型的数组,不能这样写啊,要写得这样写,哎,这个是编译可通过的。啊,行,这过了啊。那下边呢,就提到这个关于父类有泛型子类这块要不要保留,咱们刚才其实举了两个例子,一个是sub orderder,一个是SUBDER1,这两个呢,其实就哎基本上能够满足我们很多的需求了,当然在一些具体的问题当中,这两种情况呢,可能就不够了,哎,我这呢又罗列了一些这个情况啊,所以呢,一一种情况呢,是此类呢,就不保留父类的泛型了,那我就给指明了啊,当然这个指明一种,还擦除了一种呢,就是具体的类型指明了,还有一种呢,就是此类呢,我保留负类的这个泛型,保留的话呢,又出现叫全无保留和部分保留的情况,我下边呢,就列出来了这样几种,这个情况咱们简单看一下啊,大家以后用到的时候呢,你能知道诶以前讲过见过这个负类呢,我这写了两个泛行参数,此类呢,这块我直接以称呢负类这也没写,此类呢,这样这也没写,这就相当于咱们用对象的时候呢,你没有指明这个参数一样,相当于这块呢,就拿充当了。
13:24
这是这个事儿,再一个呢,就是指定距离类型啊,指定距离类型呢,就是在CE的时候呢,这不就in string,咱们刚才呢讲的其实也算是这种类型。那还有一种情况呢,就是我没有这个指明福类的这个啊,我就完全给保留了。哎,这个咱们不是也刚才也讲这个事儿了,只不过呢,这块多了一个参数而已,再下边这个呢,就是叫部分保留,就是我你这不有俩参数吗?我其中一个呢是确定的,另外一个不确定,那另外这个呢,我就给你保留下来。哎,这是一种啊,那还可以还可以,这块呢就更复杂一些,说呢,这个呃丧叫AB,其实呢,继乘以这个负类这块呢,负类这块呢,你没有写,也没指明,其实相当于是还是它只不过呢,在这个基础之上呢,你自己呢,提供了两个发行参数,这就额外的了啊,再往下指定了负类的这个翻行参数了,如果负类中有一些方法用到的T1T2,就是你指明这个类型,那你自己呢,额外的又定义了两个翻行参数,你在自己这个类当中还可以再用你自己的这个A和B。
14:30
然后下边这个这是上叫呃,保留了啊,保留了就是负类这个T1T2呢,这个我们都给他留着了,留着的基础之上,你自己呢,又额外的定义了俩。啊,这个呢,就是部分的保留了啊,那么T2呢,还是用的这个一个不确定的,然后你保留T2的同时呢,自己又额外的定义来讲啊这个样子啊这块呢,就相对复杂一些,那就是说后续大家见到这个子类去继承带泛型的父类的时候,那情况呢,哎,逃不出这里边这些情况。
15:01
哎,都是这样一些,哎这块一说呢,就稍微有点复杂了,大家呢,可以先听一听就可以了,后续呢,咱们见到的时候呢,你自然而然的通过这个例子一体会啊就能很清楚,好这呢是咱们关于这个泛型类泛型接口这块呢,一些细节的补充说明。
我来说两句