00:00
好,那么讲完了再集合和我们这个比较器当中使用之后呢,咱们来看一看我们如何去自定义啊,相关的这种发型结构啊,相当于这个零一呢,我们就讲完了,这呢,也是咱们这一章里边的一个重点。相当于呢,大家呢,需要呢,知道在集合当中和比较器当中如何去使用啊,相信呢,你拿这个例子呢回去写就行了啊,在集合当中大家主要需要关注的呢,一个是在list当中的使用,相对来说呢,还比较简单一些,另外一个呢,由于我们开发当中map呢使用的频率也比较高,所以呢,这个map呢大家也要会用。而且呢,他俩还比较典型一个呢,对应的这个泛型呢,就只有一个。然后这个map的话呢,它对应的这个泛型呢,你会发现这个参数呢,有两个排除呢,以后我们还会见到有三个的这种场景,总之的话呢,只要你有不确定的,我们就可以呢去声明这个泛型的参数了啊,你要有多个呢,我们用逗号隔开,在你声明这个类或者是接口的时候呢,这个呢,你用逗号隔开啊,说明有几个就可以了。OK啊行,然后比较器呢,因为我们在开发当中用的呢,也算是比较多的了,所以呢,咱们以后呢,在使用比较器的时候,推荐大家啊,你就用上这个泛型了。
01:10
在这个实现compable的时候呢,使用上,然后呢,使用这个comp的时候啊,像我们下边这个场景呢,我们呢也使用上。OK啊行,然后接下来我们看一看,除了呢,在现有的一些API当中能够去使用咱们的发型之外呢,我们其实可以呢去自定义。OK,所以下边我们来看看这个自定义啊,泛型这样的一个特征,那这块呢,首先我们得说明这样的一个点,比如说呃,像以前一样,咱们去了一个person。是吧,这呢,我就暂且把这个person就放在这儿了啊,这个person的话呢,注意它可不是一个泛型类。啊,是不是泛音类呢,其实非常的简单,大家你就看这个类的声明这块呢,是不是有这个监宽二就可以了,是吧。比如这块写了E,这呢,是不是就是一个泛型类了。诶没问题啊好,那如果我要不写的话呢,它肯定不是个反应类,就是我们以前讲的一个普通的类啊,他如果要是个普通的类的话呢,那咱们接着呢做一个测试啊。
02:03
哎,我就写一个generic它的一个测试了。啊,这个单词念的话呢,叫generic是吧。哎,瑞克这个呢,以前我念的是念成je瑞克。啊,其实它这个重心呢,好像有点不太一样啊,哎,稍微注意一下。好诶你看啊,咱们这个person的话呢,这就是一个普通的一个类了,他要是个普通的类呢,比如我这块呢,想创建它的对象,那你就是跟以前一样,咱们person一个P。诶,你有一个person是吧,哎,这就妥了啊,但是你不能说,诶我这块person,我这块想指明是个string,哎这个呢,我叫PR,哎,你有一个person,然后这个位置。哎,这个小括号,然后呢,我们在这个位置呢,说整一个尖括号,这呢肯定是报错的,因为你当前这个person呢,本身在声明的时候呢,它就不是一个泛型类,所以呢,你在使用的时候呢,你又不能说强行给它加上这样的一个泛型,要注意这是错误的,咱们之所以呢,能够在像a release呀,List呀,Map呀哈map呀Z呀是吧,之所以能够去使用,因为整个这个集合呢,在5.0增加了这样一个新特性之后呢,他把这个集合的API呢,基本上就全部呢都改了一遍,改了以后呢,就全部都带泛型了,所以呢,我们可以呢去声明,比如说叫a list这个位置呢,我们可以写上一个泛型参数。
03:18
啊,后边这块我们去new一个这呢就也可以用,就是因为人家在声明的时候呢,就有,所以自然而然的呢,你就可以去使用,OK啊这个呢,首先需要我们去注意的,然后呢,我们呃这一节呢,来看一看如何呢去自定义泛型的结构。那首先来明确一下,我们都有哪些泛型结构,这里边儿呢,大方向来讲呢,应该算有两个哈,第一个呢,叫自定义泛型类,或者叫泛型接口。诶,第二个呢,叫自定义泛型方法。哎,就这样的,大的方向呢,就这两种。那么自定义泛型类和反映接口其实没什么区别,主要的区别呢,还是类和接口的区别了。啊,那个接口呢,咱们前面都讲过了啊,自定义泛型泛型只不过呢,就在声明的时候呢,加一对监控号里边呢,加了一个泛型的参数啊,仅此而已,所以说这块呢,关于自定义发行类发行接口的格式呢,如果要是个类呢,就说明个class。
04:09
啊,比如我们这个叫A是吧,然后呢,这有个尖括号,一个大括号A。这就相当于它这个格式,当然了,这里边儿你不能空着啊,这个咱们一般得写个参数啊,得起个名了。这个名的话呢,一般呢,咱们习惯上呢,你看集合这块啊,它用的一个叫E是吧,E呢,你可以列成像元素是吧,Element你看这也写了。是吧,A type of elements in this list啊,所以这个E呢,就相当于是element,这个E指明了就是元素的类型啊。啊,有的时候呢,我们自己要定义的时候呢,习惯上这块我用个T。G呢,大家理解成就是type的意思了。是吧,那这个你也没有必要呢,给大家就写成这样的type,我写这样行不行?呃,严格说呢,倒也没问题是吧,但是一般呢,我们就写一个它就行,有点像咱们写那个for循环一样啊for IG是吧,就是比较抽象的这样一个符号就行。
05:00
OK啊,因为呢,你要写成这个tap吧,就怕误认为呢,真的有一个叫tap了。是吧,其实这块呢,我们这个T呢,是一个参数的意思了。OK啊行,那如果要是个接口的话呢,那就是interface了啊,比如说这是个B啊,这个位置呢,你可以写一个T是吧,哎这样个大框,哎,这就妥了。OK啊,哎,你说我这个接口里边我有两个不确定的,那你可以叫个T,比如那个呢叫E是吧,或者这个叫T1啊,我再来个逗号来个T2。哎,这呢都可以就是所以说呢,这个发型参数的话呢,没说只能有一个,哎,你要有多个不确定的,你就用逗号隔开就可以了。好,这呢,就是叫自定义的发行类和接口啊,然后方法呢,我们一会儿说。行,那这块呢,咱们就定义一个啊。另一个呢,比如我这个类呢,哎,就抽象一点了,我就叫al了啊,然后这个位置呢,咱们就写上个T了。好,说这儿呢,其实目前来看就已经是一个泛型类了。只要呢,它这块加这个泛型的这样一个参数了,这就是个泛型类。
06:00
但是一般的话呢,我们定义好这个T之后呢,你得用一下啊,你不用显得多尴尬是吧,那就没必要定义了啊在这块用呢,主要体现在哪呢?诶我们下边说的啊。哎,声明了啊,类的泛型参数以后啊,就可以在类的内部使用此泛型参数。注意这个泛型参数的话呢,咱是表示的一个类型,所以呢,我们说在里边使用,在哪使用呢?比如我们现在生命的一个属性,这个属性呢,就是T这个类型的。啊,它是有一个元素,假如就要T了,哎,还有呢,确定的,比如我们有类型的叫order ID是吧。啊,那这个奥ID呢,就是确定的int类型,这个T的类型呢,元素的T的类型呢,就是T是不确定的类型。行,这呢相当于咱们在属性当中使用了,诶那我们也可以呢,在构造器当中使用,这跟咱们以前用的是一样的啊,比如我们整个空间构造器,诶整一个这个代餐的构造器,代餐的构造器里边我就把这个器呢给用一下。
07:00
我就写成T就行。OK啊行,那包括方法里边啊,典型的话呢,就是比如说我们提供这个盖菜的方法啊,针对这两个都提供一下。哎,你看这是关于T的,我就要get t,然后它的返回质类型就是T,在的时候呢,它的类型也是T。哎,就这样来处理就行,包括呢,我们再加上一个to string。哎,周琦是吧,哎,OK一下这呢也能把这个T呢给打印出来。哎,所以说呢,没什么大不了的是吧,也不用特别的紧张啊,其实呢,大家在定义这个发行类的时候,你可以呢,有个小技巧,你就把这个T呢看成是有一个类。有个类型就叫T类型的是吧。比如说呢,这个T呢,你就想象成是string。是吧,你下边该用的时候呢,该咋用还咋用,但其实呢,你得告诉自己这个T呢,它不一定是string。它还可能是一个别的类型,哎,所以呢,它是一个相当也叫参数一样,不确定是吧。好,那这块呢,我们这个自定义这个发型类呢,咱们就写完了,那写完以后呢,咱们就可以来这儿呢,去测试啊。
08:00
哎,测试自定义的这个,哎泛型类了,哎,咱们写一个单元测试方法啊。行怎么做呢?哎,你比如说我们定义的这个order呢,是一个反应类了,那我们在实例化的时候。哎,实化石就可以。哎,指明哎,咱们这个叫类的泛型参数的类型。对吧,哎,所以这会儿你看我生明order的时候,你像原来咱们要写的话呢,我就这样写,诶目前看你看你说这样写对不。是不是也可以是吧,对这个呢,大家怎么判断呢,你就想咱们集合嘛。就是现在咱定义这个order呢,就有点类似于耳类一样呢,生明的发型咱们用的时候呢,是不是也可以不用啊。对的啊。哎,这个主要原因是啥呢?咱们也说过了。对,这个呢,主要原因呢,就是为了体现这个乡下兼容。这个向下呢,指的就是咱们点。这5.0之前是没有在饥饿中使用型的啊。
09:07
或者说这个集合是没有生命为泛型的是吧?集合是没有声明为诶泛型的,那所以说5.0之前呢,咱们要写代码都是这样写的,现在你突然呢,5.0加了一个泛型的东西,如果呢,你要求用户必须强制的这样写,那以前的代码就全就报错了。那这个大家就没有升级的这样一个动力了,所以说的话呢,诶我们这个类呢,是一个泛型类,你在实际使用的时候,当然这时候使用呢,咱们指的就是实例化的时候啊,你可以用,你也可以不用。那你要不用的话呢,那我就认为是吧,对于咱们这个集合来讲呢,就是咱们调艾特方法就认为你是object扎了。哎,所以这里边儿你写个123那是可以的,然后list。1.i的啊,我们来一个A是吧,也是可以的,而对于我们上边这个呢,那就不行了,这呢是我们建议以后呢大家这样写,指明了发型了,我只能是放这个字串类型的。非这个字符串类型的啊,整个123,这是肯定要报错的了。
10:03
诶这点没问题哈,好,那么回到我们自定义这块呢,其实是一样的道理啊,那我现在呢,相当于就没有使用啊,这个类的这个泛型了,那这时候大家你看啊,我通过这order,咱不是有一个属性呢,叫气是吧。我要是get一下吧。Order,你看这个类型。是不是也是债类型啊?对,既然你没指定那是个什么类型啊,这块说哎,那干脆就是object类型得了,哎所以这呢,就object类型的一个,哎,Obg就成这样了。括这个order ID是吧,Order点我们去一下ID,你看这时候呢,不是ID了,这个哈,这时候你发现它也是一个类型。啊,就是这样一个场景,行,那通过这呢是一个object类型呢,其实我们这块呢,还想强调一个点。什么呀,就是我们下边呢,不是可以给这个类的泛型参数呢,指定一个类型吗。这个类型呢,大家注意只能够使用引用数据类型,哎,不能够使用基本数据类型。
11:03
啊,其实从这呢,你也能大概看出来啊,咱们要没指定的时候呢,他就认为是object类型了。我们这类型,那就是全部是我们引用数据类型这个体系的一个根了,那你基本数据类型呢,显然呢。这个也不跟你玩啊。是吧,你比如说这块呢,说你没指定没指定那就是不确定,不确定,那咱们就用一个顶级的一个类型来充当,那显然呢是object了,但我们这呢,只是引用类型这个体系了,这个在规定当中说基本数据型啊,就不能够往这个泛型参数这块去写了,然后写个int。我叫奥一,哎,你一个奥哎这么着他就报错了哈。哎,这呢就体现出来就是这个泛型参数啊,在指明时是。不可以使用基本数据类型的。啊,基本数据类型的,那杨I呢,就是只能够使用引用数据类型,那假设呢,我们现在就想操作类似于基本数据类型这样的结构,怎么办呢。那你是不是使用包装类是吧,哎,是但是啊可以使用。
12:05
哎,包装类呢,去替代啊,咱们的基本属类型。诶OK啊,所以这儿呢,有个点需要注意一点,因为呢,你看我这块写int类型不行了,但我写包装类可以,因为包装类呢,它还是属于这个引用类型这样的一个体系的啊啊,这个我们来个ORDER2啊,你一个order啊。这让整个监控,哎,这看这都没问题啊。好,包括呢,我们再整一个啊,这个位置它放的是个string是吧,这都可以啊,只要呢是已数据类型就都行,好,那一旦呢,我们指明了以后,比如这个ORDER2点,我们再去get一下这个T,这时候呢,它就是型。哎,就是因为呢,我们声明的时候呢,这是所以呢,它返回呢,类型就也是一个类型的。哎,这个大家注意啊,只不过呢,这块没有复合值,这个值呢,实际上是个nor。哎,知道这个事儿就行啊,下边呢,也类似的道理,诶ORDER3点,比如我们这块呢,去set的时候,这时候呢,它只能是放个字符串。
13:03
哎,你放别的类型的就不可以了。好,这个呢,就是我们跟讲集合的时候是一样的啊,说一旦呢,我们指明了啊,这个类的泛型参数了,那么凡是在这个类当中使用这个泛型参数的地方。哎,就全替换为呢,你现在指明的这个类型了。啊,这个我就写到这吧。啊,这个呢,咱们是在实例化的时候啊。在实例化时,比如说咱们造对象的时候呢,是可以指明啊类的泛型参数的具体类型。是吧,这是我们就指明具体类型了,是这呢,其实是一个新特性哈,咱们也可以把它加上。OK,可以指明这个类型,那一旦指明。啊,这个泛型的类型了。啊,一旦指明了是吧。哎,泛型的类型则。啊,在泛型类中,凡是使用。
14:00
啊,泛型参数的位置。啊,参数的位置是不是都替换为指定的类型。啊,这有点绕是吧。啊,其实呢,也很好理解哈,一旦咱这块呢,指明是个了,那么这里边儿呢,凡是咱们用这个气的地方呢,就全是了。哎,这呢,就是我们说的主要的这样的一个场景。啊,其实是不是也不太难是吧。诶就是关于这块呢,大家其实你就想谁啊,就想咱们这个前面使用的这个像Ali是吧,诶跟它呢,其实是一样的啊,只不过呢,它是定义现成了,咱们这个呢,是咱们自己定义的啊区别也就在这儿啊呃,其实这块咱们讲自定义泛行类也好,泛行接口也好,咱们后边呢,在比较长的一段时间,这呢其实咱们都用不着。诶,所以呢,从这个角度来讲呢,这儿呢,大家呃,做一个熟悉就可以了啊,等以后需要用的时候呢,到时候再看一下也行啊,其实他也不难,不外乎就啥呢,你看它咋定义的,咱们就也照着抄一抄就行。啊,这块大家也不用有特别大的这个思想这个包袱啊,你像以前咱们定义这个,比如注解的时候。
15:04
是吧,咱当时呢,定义注解说得用一个这个圈叫interface来定义啊,说具体咋定义呢,这个大家你也不用死记硬背,你就看一下咱们典型的那个叫surprisewing是吧。诶,当然我不是说过这个嘛,是吧,这个稍微有点长哈,Surprise warming,你看它咋定义的,咱们就照着它呢这块来去定义就行了。诶后边呢,咱们还讲过这个异常是吧,异常的话呢,我们还可以呢,叫自定义异常,自定义异常咋定义呢?你看一下那个exception咋定义的。是吧,哎,它咋定义的,咱们就也怎么定义就行,哎,现在的话呢,我们还可以自定义这个泛型类,哎,咋定义呢,你看一下release咋定义的。是吧,他怎么定义的,然后我们大体上我们就也怎么去定义就行,哎,就是类似这样的套路啊,所以呢,大家不用诶特别刻意的花很多精力的去记这个事儿。啊,你就按一下现有的这个结构去定义就可以啊。好,这呢是我们自定义一种场景,然后呢,如果我们看一下这个的话哈,大家你会发现呢,你看它是这样写的哈,它这有一个意,然后他又继承的这个东西呢,也有意。
16:05
来实现这个也有意义。感觉好像有点特别是吧。诶,所以这块呢,我们想接着呢,刚才提到这个order之后,咱们下边呢,针对order的子类啊,这是以类这个特点来说的哈,我们来看它的子类,子类呢,在继承这个order的时候呢,它表现出来的一些特点啊,跟以前我们说继承有什么区别?比如说首先呢,我们来一个叫sub。哎,叫ORDER1吧。好,然后这个类呢,咱们去继承这个order。以前的时候呢,咱们写集成就完了。现代话呢,你得小心一点了。但这个order呢,是一个泛型类啊。那继承的时候呢,这块就得考虑这个泛型的参数怎么办的问题。目前来看的话呢,我这样写你看也没报错是吧。哎,那首先问个问题,这时候这个sub order1它是泛型类吗?这把不准了是吧,其实非常简单,你就看他带不带监控号就行了。
17:02
是吗?不是没带吗?是吧,诶非常简单,你就看他带不带千号没带没带那就不是,所以说呢,这时候我们说这个萨8.1呢,它不是一个反行雷哈。非常简单啊,他要不是个翻译类了。那这个事儿呢,下边这个又简单了。这个呢,咱们相对来来测试叫order,哎,它的这个子类啊,来测试它的子类了。好,那既然呢,咱们说的这个萨包特一,它不是一个发行类了,所以呢,如果现在要实例化。哎,咱们这个sub。一是吧。那你看一下啊,Sub。哎,ORDER1,然后呢,我叫一个萨一吧。诶,你有一个s order1,那这样写呢就没有问题,因为它不是个泛型类,就跟以前一样,那你要是认为它是个泛型类的话呢,你可能还是想去给他加一个方形的,但事实上呢,你只要一加它就错。
18:05
你看这样是吧,你看这是不对的啊,因为呢,它不是一个反应类,所以呢不能这样写。啊说因为一。不是泛型类啊,不来说此处编译错误是吧。好,那它呢不是个发言类,那我就这样写了,那大家可能会有个疑问啊,说呢,我们这个order里边呢,定义了这样的一个属性,那我们继承以后呢,这个萨一呢,是不是就也有了。那么问沙包里边这个T的属性的类型是啥?诶对,就是object,就相当于呢,跟咱们自己在造一个对象的时候。咱们自己造这order对象的时候呢,不是也可以不指定这个型吗?你没指定这个T不就是object类型的吗?它呢也类似于就是没有用。这个泛型参数没指明,没指明那就认为是object了,所以呢,这时候你看我们这个sub一点,我去get一下这个T,你看这个反类型,这不就是object类型了吗。
19:03
其实也很好理解是吧。行,这个呢是我们的一种场景。啊,这一种场景了,然后呢,接着再来啊。咱呢,再去new它的一个词类,诶,我就ORDER2了。诶,这个呢,我去继承一个叫order,我怎么写啊。哎,在这个位置呢,咱们就指明了它是类型了。是吧,哎,我就指明了。啊,那这个一旦指明之后呢,问萨达二,它还是反应类吗。它是反应类吗?这个刚才说这白说了。诶,那再明确一下什么叫发型类啊。就你带个肩炮是吧。带净化的就一定是吗?啊,带金花的其实就是是吧,哎,带声明的时候啊,这个呢,首先你看我们这都没带哈。就是你从这个角度来形成判定,再一个角度啥呢?就是我们这相当于是就是大家得理解这个泛行参数的本质啊,本质就是它有一个不确定的类型是吧。
20:06
那你这会儿你看一看,我们不管是萨一也好,还是萨二也好,它有不确定的类型吗。没有是吧,这个一呢,这块呢,我们没有写,其实认为就相当于object。就是确定的哈,然后这个话呢,你明确确定的是了是吧,它没有不确定的类型,就没有这个参数的存在,所以它也不是一个泛型类啊。啊,为什么我们非得强调是不是呢?因为呢,它是个反人类了,我们回过来你在造对象的时候呢,是不是才能这样去写,是吧。你要不是个反人类的话,你得这样去写啊,这个注意一下,所以呢,诶这个萨巴一不是萨巴达呢,也不是啊。啊,这个来一个四。那既然呢,你也不是,所以呢,我们S2的时候呢,比如我们这块呢,再造一个S布一,哎,你有一个S2,那你也得这样去创建,你也不能去带那个监号啊,那其实呢,你已经继承order的时候呢,指明了是in特尔了,所以回过来呢,我们这个sub1.2,我们去get一下T。
21:09
实际上呢,就是类型了。没问题的,看是吧。因为他已经具体的指明了,诶所以从这个角度来讲的话呢,怎么说呢,就是我们在诶什么时候能够指明,对于这个order类来讲。哎,注意听啊,注意这个对于这个奥特类来讲呢,诶什么时候可以指明它的泛型的类型呢,咱们刚才那会儿说过呢,就是在你造对象的时候。哎,这时候你看指明一下类型。还有一种情况呢,是不是在提供你的子类的时候啊。诶,也可以指明。啊,那一旦指明之后呢,这个子类的这个方法里边啊,继承过来的,包括属性啊,你一旦指明了,那这里边儿它的方法呢,就没有那个不确定的类型了,就是你指明的这个类型。啊,就用就可以了,实际上这也很好理解啊。好,那这个完了以后接着啊,大家你看我再来。我呢,再创建一个叫这个我叫三了。
22:01
让他呢?哎,我继续乘以order。怎么着呢,哎呀,傅类这个气啊,在我这儿呢,也不确定。也不确定,那怎么办呢?那你把你那个T呢,还拿过来,然后在我这个位置呢,我还叫这个T。哎,这就可以了,就是这个T呢,相当于就延续了负类中的这个T了。啊,那么它是反行类吗。对它代替了是吧,这个它呢就是一个泛型类,哎,那么我们从这个order这里边儿呢,继承过来一些属性和方法,那个属性方法里边那个T啊,还是不确定的,就完全的延伸过来了,延伸过来之后呢,咱们可以在负类的基础上,你可以呢,再增加一些方法啊,比如说我们public y来个受方法。哎,咱就举例呢啊哎,我这呢,就这样一下,里边打印一下这个小T完全没问题。就是这个气呢,完全延续了父类中的这个气。那进而回过来。哎,下边的话呢,我们就写到这儿了啊,针对我们这个叫sub order3,因为你是个发型类了,比如这儿我写个润。
23:02
哎,叫S2,哎,你有一个,哎sub这样。好,那么你看这个SUB2,哎,我通过它的呢,去get一下这个T,哎,这位T呢,就是咱们刚才指定的这个string的类型。哎,这能看就没问题。OK,包括呢,我们这个S2点,咱们刚才写了个受方法,这个受里边呢,也出现这T了,我们也指定为是死类型的。哎,这个OK吧。啊能理解啊行,就相当于呢,我们负类你又不确定了,到我这儿呢,诶我还不确定,我只是想对你的功能呢实现一个扩展了,诶我们又增加了一些东西了,包括你想重写也行。你像咱们这个,诶刚才呢,提到那个a release的是吧,A list呢,就是这样特征哈,它呢是继承于我们这个父类的,父类里边呢,它又不确定类型到我这儿的话呢,那我也不确定,那咱们就继续的给它往下延伸下去就可以了。OK啊,这个呢,是我们说的它然后还能变吗。还可以变是吧。
24:00
哎,Order,我们来一个是吧。诶这个呢,我们去继承这个叫order,诶我们前面已经提到了,说要么呢没写,要么呢就是写了一个具体类型了,在这儿呢,然后三的话呢,就是也没写不确定,那四这块呢也不确定。也不确定的话呢,我们这块呢,就还可以延伸过来。是吧?嗯,或者再再写个这样的吧,先来个确定的吧。这不就确定了是吧,确定之余的话呢,你看啊诶。我们这块也不报错了是吧。那这样也是一种方式,但是建议这块,比如我们再换一个也行啊。哎,父类这块呢,它那个叫T了,我这块指名成阴了是吧。指名之余。哎,如果我要是这样写。它不是一个反应类。啊,但是呢,我们复类这块呢,确定的方法在这都能用了,但是我这块呢,我又多了一些不确定的东西了,那我呢,还可以再声明成是一个泛型类。啊,比如这块我来一个E类型的一个小E。
25:02
是吧,然后呢,怎么着呢,哎,我来一个勾搭器吧。隔到期呢,咱们说整一个空餐的是吧,哎,先调福里的空餐的,自己呢也是空餐的,哎,这是一种。然后呢,比如我们再来一个啊,要构造器要负类空三的此类这块呢,我们加个E是吧,这是一种还可以来走起啊,要构造器要负类这个负类这个你看它写的是个T哈,我们叫它,然后子类这个也加上成这样了。那这块呢,大家你会发现呢,诶我们在这个副类这块,你看掉的这个构造器哈,构造器里边前面是这个气类型的,诶它怎么自动生成给我写成特了呢。因为这是不是确定了。对,所以这个就过来了,然后呢,我自己这块又多了一个不确定的类型。或者我说这个多了呢,也不对,只能说呢有一个是吧,因为从负类过来,这个呢,已经不是一个不确定的了。就是引体,只是让你自己有一个不确定的类型。哎,注意是这样啊,包括呢,关于这个E呢,咱们提供一下这个盖菜方法是吧,就针对它我就提供一下,哎,所以呢,这个类呢,它也是一个发型类是吧。
26:08
它是个反应类,它呢是把负类这个呢,确定好以后呢,自己又多了一个不确定的类型。诶,回过来。啊,这个我就还写这儿吧。哎,所以呢,大家你先确定它是不是反应类,然后呢,进而决定你这块呢,在声明的时候呢,怎么去写啊,比如说这个呢,我写成是诶四针了。哎,萨三。哎,又一个sub,哎就这么着了,好,那么这个SUB3注意啊,我要是去get这个T的时候,它系成负列的时候呢,指明是英特尔了,所以这块呢,那就还是英特尔。啊,这没问题,然后呢,这个S3呢,咱们有个get e是吧,这个E呢,咱们自己指明的,这不是一个词缀类型的吗。哎,所以这块呢,就是我们指定的这个类型的。啊,这个稍微注意一下啊,行,这个呢,说的是我们这个场景,那以后呢,还有可能会有这样的场景啊,也就这么几种啊,咱就都给大家列一列了,我来一个萨五。
27:02
啊,怎么着呢,它继承于咱们的这个呢,还是T将内呢就给延伸过来了,那我们这块呢,得把这个T呢给它加上。就是你不确定的,到我这儿还不确定。那不确定之余呢,我们说还可以再加上一个E。诶,这个看能理解了吧。这个你看啊,我现在要提供构造器的时候。哎,咱们整个比如说空餐的吧。哎,这是空餐的这个啊好,然后呢,我们再来一个这个参数比较多的,但你看我这又掉了奥里边俩参数这个,然后自己这个呢也补上,你看它就长这样了。就是你付了这个过来的时候不确定,我这儿还不确定,但同时呢,我又多了一个。是吧,哎多了一个,那还有一个,哎就这样的情况。哎,这个呢,比如我们在加了个改善方法啊,如此啊好,那它呢,显然也是一个反应类啊。哎,它是个发现类,好,那是一个发衍类,我来再测。啊,这个我们就还写到这儿吧,诶这时候呢,大家注意哈,我们这个萨五的时候呢,有两个参数了,所以你得写俩了,比如我写一个前面是string类型的,这个呢,先后顺序有要求不。
28:12
对,那太有了是吧,哎,因为这里边这个T呢,实际上是负类里边那个T了啊,所以你这块你要写成string的话呢,负类里边那个属性呢,是string类型,相应的方法也是string,这个呢是你自己的。所以这俩呢,你得分清楚啊,哎萨四,哎,你有一个哎萨五啊这样个情况。好,这是你这个SUB4,哎,注意啊,咱们去get那个T的时候呢,因为你这个T呢,是用string型的来指明的,所以这块我们这个T的类型就是string类型。啊,那你这个四第二咱们去get那个E啊E呢,这边你写的是类型,所以呢,它返回的这就是类型。哎,这样行,这个名这块呢,我没有太关注哈,那就随意让它呢,自动生成的了,主要呢,我们看这个类型这块。就这样是吧,好,那这呢,其实说到这儿呢,也就说完了哈,至于说呢,你这个order,诶,你可能说有一个不确定的,说我有俩有俩,那你就再这样写也行是吧,这个就比较简单了啊,只要会一个了,那两个多个的都一样。
29:11
行,也就这么几种情况。啊,相当于呢,我们在啊针对这个泛型类提供子类的时候呢,你可以呢,指明它具体类型。啊也可以呢,不指明是吧,不指明的话呢,你就看一下,那就具体呢,像我们刚才说这种场景啊,这呢属于没指明啊,这呢也没指明。啊,那妹纸名之余,你看这个此类呢,如果还想加,那就再加也也OK啊,没问题啊,也就是这样的几种情况啊。好,那么这儿呢,关于这个自定义发言类的这个大体的内容呢,其实就是这样的,当然还有一些使用的一些稍微的小的一些细节啊,这块呢,咱们就可以呢,从这个课件里边啊,直接呢,咱把这个对应的这个说明,诶我把它呢粘过来,咱们从上往下呢,再稍微的过一下。哎,直接粘过来就行啊。好,这块来看一看啊,我们这边提到这样几个点,第一个就我们这都提到了啊生呢,在声明自定义反应类以后,我们可以在类的内部属性方法构造器当中使用类的泛型啊,刚才已经讲过了啊,第二个说呢,在创建自定义反应类的对象的时候呢,我们指明这个泛型参数具体是什么类型,一旦指明了内部呢,凡是使用这个参数的位置呢,都是你具体的类型。
30:20
啊,这都说过了啊,然后呢,下边这个啊说呢,如果呢,你创建自定义反应类的对象的时候呢,要是没指明,那就指指明这个参数类型,这就是发型就被擦除了,咱们就按照object来进行处理了,哎,这有一句话说,但是呢,它不等价于object。这是什么意思啊?不等驾驭是吧,诶是这个意思哈,就是你比如说咱们拿上面咱们写的这个order来讲,所以呢,这个呢,我们就本来是一个泛型类,你没有写这个泛型参数,这个泛型就擦除了。然后他就认为你是个object布扎就成这样了是吧?诶那这个呢,其实想说的是它与这个结构啊。
31:01
哎,这个叫AA,就这样啊,我叫order。2.12.22.3吧,是吧,你有一个order这样写的。哎,问的就是这个写法跟这个写法。是不是一样,或者是不是等价于?哎,现在说的点呢,就是它俩呢不等价。在这个不等价的关系怎么去理解呢?咱们呢,这个下边要讲的这点就是泛型在技能上的体现,到时候咱们再说。啊,简单来讲的话呢,就这个理解成是我们GDK5.0之前的写法。是吧,然后这个呢,是5.0之后呢,你用了泛型了,只不过这个泛型你明确指定它是object。啊,这个呢,是就是这个呢,完全不校验你的类型,这个是校验类型,只不过这个类型是object而已。是有区别的啊,这个咱们暂且的这个事儿先放一放,讲到下边这知识点的时候呢,大家就清楚了,好接着啊这块这个呢,建议大家呢去遵守一下。就是咱们包括集合当中也都体现了一个泛型了,那到底我们开发当中用不用泛型啊,这块我写的说泛型啊,你要用你就一呢都用。
32:04
啊,也没说非得要用不用呢也行,但是你要不用的话呢,那就一路呢,你都别用了。你别用着用着到后边就没了是吧。哎,差点意思啊,什么意思啊,你看咱们讲这个release的这个时候啊,这不咱们就用了,哎,这就用了,这用的话呢,你用迭代器的时候呢,迭代器返回的不也有这个泛型吗。那就一路都用。你别到这块用,然后到迭代器那就不用了,那你还不如干脆一开始就别写得了。啊,这个呢,有点像咱们生活当中,比如说这个扔垃圾也是一样是吧。我看现在上海这个垃圾呢分类了,但是呢,实际上也都大家乱扔了。我在北京的时候呢,也是这样啊,印象特别深,我在北京那个小区住的时候呢,也是以前呢那就随便扔,后来呢,也是要讲这个垃圾分类,然后呢,每天早上呢,去楼下扔垃圾的时候呢,这边都有一个那个那个阿姨是吧,在这坐着啊,然后过来之后呢,他就告诉我这个应该往哪扔。我说也行是吧,让大家养成这个习惯嘛,但后来呢,发现呢,过了一段时间,这个角色呢,这个岗位就给撤了。
33:01
啊,为啥给撤了呢,你发现这块呢,他一顿给交,然后大家都按照这个扔,然后呢,一个垃圾车来了。咔咔咔一顿扔。全都到一起了是吧。这没有意义了,就啊,就整这些虚的东西啊。你最后呢,都倒在一起了,那不这块还是分不出来嘛,所以干脆这个岗位就撤了是吧,诶就跟类似这样啊,你要是用的话,你开始就用着,你要后边又不用了,那其实意义也有限。OK啊。好,这个呢,就咱们说的这个意思啊,回过来下边这个说泛型的指定中必须呢使用营类型,不能使用基本数据类型说过了啊,下边这个呢,其实就说我们刚才呢,举的这样的一个子类的这个场景啊,说了除了创建泛型类的对象以外呢,呃,继承的时候呢,实验接口的时候呢,我们也可以指定这个发行参数的这个类型。啊,这就比如说我们刚才说的。嗯,这个不是了。这个场景就是是吧。啊,这个三不是二。
34:02
哎,就300点啊在这。哎,还可以呢,嗯,在这儿啊,在这儿写,比如。哎,咱们的叫sub。诶AL2是吧,诶它呢是说呢,如果我们在在给这个泛型类呢,提供此类的时候呢,此类呢,也不确定泛型的类型,大家可以还可以呢,继续使用泛型的参数,这个应该就是我们说的这个情况了。沙包三。那就他啊。行,下边这个所呢,我们还可以呢,在现有的复类的泛型参数的基础之上呢,新增泛型的参数,呃,这个呢,在这个基础之上呢,在新增这个泛型参数,这是萨包的五啊。萨的五啊,那这个四呢,我们怎么着呢,这个指定的同时呢,自己又增加的。啊,这个往哪放呢。哎,在线的这个提供子类呢,也不确定反应参数类型,继续使用,发现这个咱们写到这儿吧。
35:01
哎,这个呢,也相当于是在负类这个基础之上呢,我们有新增加的一个反应参数啊,诶往这放了啊好,这个呢,大家体会一下就可以了,然后额外这块呢,有几个注意点,哎注意点里边呢,有两个点呢,我们需要给大家呢再去强调一下的啊,这个我就直接放这儿了。嗯,这个参考这是吧。看这啊,所以呢,如果你要有多个反应参数呢,你就写多个就可以了啊,这个用逗号隔开,然后呢,7.0开始呢,这个位置呢,可以就不用把这个具体的类型呢写上了,这个是一个类型推断啊,所以呢,如果泛型结构呢,是一个接口或者一个抽象类,则不可以创建泛型类的对象。这个其实跟是不是泛型没关系。对,接口跟车辆类主要不能造对象是吧?哎,这个没啥说的,这个看大家能不能理解啊。所以呢,我们不能这样,比如我们有个类,这个类里边呢,有一个E的发行参数哈,然后呢,我们不能呢,在里边呢,去这个E的数组。这个能理解不?因为这个E呢,它是一个不确定的类型是吧,你这个你有一个类型,这个已经明确是E类型了。
36:05
哎,所以这块呢,你不能这样去写。啊,这块说你可以这样写啊,诶这样写呢,倒是可以哈。就是还是你我不这类型,然后你把它强整成某一个不确定的类型,这个行。那这个大家了解一下就行啊,你看咱们类的话呢,它底层这个数组呢,它就不是一个异类型的。哎,它呢,就全是这个object类型。啊,就是你在添加的时候呢,咱们限咱们限制下那个E的那个类型at的时候呢,只能是一个E类型的了,但是都放到一个object类型数组里了啊。啊,这个了解一下啊,然后这块呢,在类或者接口上生命泛型啊,代表某种类型这块说的,但不可以在静态方法中使用类的泛型。你看这个能不能理解。这个咱们就是要说的这第一个点以order为例是吧,Order里边呢,假设咱们这块呢,比如public。Avoid来一个叫METHOD1。
37:01
哎,这是一个普通的方法啊,在这个方法里边呢,比如我们就打印一下这个T的这个值了。咱这里不是有个T吗?这个没问题哈,但是如果我要加个代立克,你发现它就报错了。当然有同学说你这个T它也本来不是一个。啊,也不是一个static的啊,那有可能是这个原因造成的是吧。但其实这块呢,你看我加上一个。斯呆立克是吧?哎,加上一个study的话呢,这块其实它。嗯,他给他把这个错给报到这儿了。他把这个错给报到这儿了,这个咱们啊,那还得再。我再声明一个吧,是吧,比如我声明一个啊,叫做static的。这个我写成是一个T类型的,叫T1吧。啊,这个他是吧。然后呢?诶,你看这块的是吧,不行,这个怎么理解。嗯,对你看啊,咱们刚才呢,其实讲这个确定这个泛型参数的时候呢,说过哈,呃,一方面我们可以在造对象的时候。
38:08
指明这个题的类型。或者的话呢,在继承的时候指明这个类型是吧,那你像我们在造对象的指明,相当于你实例化的时候才知道T是多少,然后呢,我们要是使用类去调离静态方法的时候呢,此时这个T呢,还不确定是吧。哎,所以这时候呢,他就不可以。啊,这个大家注意一下这个问题啊。好,这呢是一个点,然后还有一个点的话呢,就这块儿提到关于这个异常类哈,说异常类呢,不能是带泛型的,它呢是这个意思。啊,这个大家做个了解就行啊,咱们前面呢讲过呢,去自定义场内了,这就是my exception,我让大家去继承,比如说exception是吧,里边呢还有一些细节啊,这个细节呢,我就里边就不去写了。哎,细节呢,我们就略了啊,然后呢,如果这个类呢,你说诶我这个my except上有不确定的,我这块能不能整个T呢,不好意思不行。啊,这个异常的这个体系呢,它都不能是发行类啊。换换句话说呢,你也没啥不确定的啊,就是一个异常类型嘛,这里边儿呢,其实也没什么东西,咱们原来写的时候呢,不就是一个全新常量构造器,也不会增加一些东西了,异常呢,咱们之所以去自定义,主要还是想看它这个名是吧。
39:12
建明之意嘛。是吧,仅此而已啊行,所以说这块呢,他也没有必要加泛型,换句话说,你看加了之后呢,还是你报错了。哎,知道这个事儿就行啊。好,这个呢,就是咱们自定义泛型类的一个事儿,然后呢,泛型接口我就不讲了啊,因为呢,泛型类和泛型接口的区别,还是类和接口的区别,自定义泛型类型状接口呢,其实也同样道理就行啊。这个我们说完之后呢,下边还有一个呢,叫自定义泛型方法啊,自定义泛型方法首先呢,你看我抛了一个问题说呢,在泛型类的方法中使用了类的泛型参数了,说这个方法就是泛型方法吗。哎,是这个意思啊,你比如说咱们这呢,有个T,哎,在咱们下边这个方法当中,比如说这个位置,比如说这个位置,哎,这两个方法使用了类的泛型参数了。
40:01
哎,相当于就是问咱们下边的这两个方法是不是反应方法。哎,这块注意不是啊。诶,如下的两个方法,诶不是泛型方法,那下面我们就要问,那到底什么是反型方法是吧。哎,什么是翻译方法呢?这块有个具体的格式啊,格式化呢,咱们,哎先一个例子来说吧,咱们正常呢,在声明一个方法的时候,比如说public。Avoid。是吧,啊,来一个method。啊,然后这个位置呢,是这么着的。哎,原来的时候呢,比如我们是什么类型的呢,比如说是哎死锥类型的。哎,有个HR。哎,就是这样的,哎反应类型这块呢,比如说也也是个死轮类型的,这是以前的方法,所以现在的话呢,诶泛型方法就是我们会有不确定的东西了。这时候呢,比如这个string不确定,咱们用一个E来表示吧。那这个呢,假如我也写了一了。哎,这就叫不确定了。这个不确定的话呢。这个当然也可以确定啊,你说我就是死论也没毛病,但是如果说呢,诶这个类型是什么,这个类型也是什么,那你这块也改一下。
41:05
那就这样了啊,但这块改完之后的话呢,这个大家如果把这个方法要是放到咱们这个,举个例子啊,咱就放到里边了,这块我用的是T。啊,我就正好岔开一下啊。这块你想我要写成T的话呢,是不是就又成了你这个类的泛型了是吧,我得给它错开吧。所以我得换一个字符了啊好,但是你这样一写的话呢,这个编译器就报错了。对,因为这时候编译器呢,它把这个E啊当成有一个类。啊,说你有个类角意这个累了,我把这块,呃,一确定这块肯定就不报错了。是吧,它当成个类了,但实际上咱现在想表达的是这不是个类,这是一个泛型参数是吧。那你得告诉编译器说我这是一个参数的意思啊,你调离方法时候,你告诉我意义是什么类型,不是有个内角意义。那你这块呢,加上一个声明。你在那加个E。哎,这就可以了,然后呢,因为这有反复之类行嘛,咱们暂且呢先no哈,诶这个呢叫反省方法。
42:07
哎,自定义反省方法。啊,这个叫反应方法,这个大家能。理解不?实际上呢,你看一个方法,它是不是翻译方法的话呢,也非常的简单,怎么办。对,你就看他前面这个方法声明里边有没有这个符号就可以了,只要有这个符号的,它就是泛性方法。啊,非常简单啊,那有同学呢,以前说啊说呢,我们这儿叫,呃体现了叫权限是吧,这个呢叫反馈类型,这叫方法名,这叫形态列表,那这个呢,是来干什么用的。这个呢,就是来表明咱们这个方法是一个泛音方法,诶指明就是给编译器看的哈,让编译器知道呢,说我后边这个E啊,不是有一个内角E是我这个参数呢,是一。啊,那么问题下一个啊,你说我这个E什么时候给他指明是什么类型啊。
43:01
就调的方法的时候是吧,哎,指明就可以了,诶没问题,就是这个意思啊,所以呢,回过来啊,这个我们必须呢在这个位置啊,你得有一个这个发型的一个声明是吧,让编译器知道呢,说我这是一个参数的意思。好,那这个格式呢,就这样啊,叫权限修饰符是吧,然后呢,你有一个具体的泛型这个参数T啊E啊都可以啊,然后呢,还是哎返回值啊,类型方法名是吧?括号里边呢,这个叫哎行参列表OK啊哎,这是一个大括号。还正常去写啊,然后呢,我们这儿呢,既然有这个T了,通常的话呢,咱们在返回的类型或者是形态列表当中会出现这个T。啊,因为你已经指没有不确定了,那通常在这块就会有是吧,这块稍微在这儿说明一下啊。哎,通常。哎,在咱们的哎行参列表或返回值,诶类型的这个位置。
44:01
哎,会出现这个泛型参数七啊,这个大家注意一下,行,这个呢,就是我们说的这样一个格式,刚才呢,我们也提到这个几个点了啊,比如说第一个点提到了。哎,这个我们在声明。哎,声明泛型方法时是吧,一定要呢,添加这个。哎,添加咱们刚才说的啊,这里边儿呢,像这样的这个参数是吧。哎,添加这个泛型参数啊,就是它你要不加的话呢,这个编译器呢,就不知道你是一个参数的意思了。好,那下一个问题呢,就咱们刚才说的啊,说这个泛型参数呢,在调用方法时指明其具体类型。啊,在方法调用时。哎,指明其具体的这个哎类型好,那比如这块我们写一个方法啊。嗯,比如这块呢,我们做这样一个需求,哎,Public啊,写个什么方法呢?嗯,我这儿呢,有一个我先写成word了哈,我这有个数组。
45:03
Copy,我叫from a。嗯,To list啊有点长啊,然后呢,我这有个。这个参数啊,这是一个数组。这个数组的类型呢,是E类型的。啊,然后呢,我希望呢,当你把这个方法调用完以后呢,把这个异类型数组中元素呢,全放到一个release当中,然后把这个release呢返回。哎,注意又返回了,所以这块我们接收一下啊,接收的话呢,如果具体呢,就说了是release了,那我就用release来接收。但是这块呢,你想想,而类呢,里边放的是不是就也是一样。那就这样,那这块呢,你得告诉我们的。啊,编译器说我们这个,诶,这是一个泛型方法是吧,所以这会我们得加上一个它啊好,那这里边怎么写呢。哎,这是定一个泛型方法将。啊啊,这个呢,数组元素。添加到。这个对应啊类型的这个当中。
46:04
哎,并返回是吧。OK啊行,这种其实写的话呢,并不难哈,大家呢,你要觉得不好写,你就把这个E呢,就想象成是一个具体的类型,或者你就具体的我想象不了,那你就把它想象成润。是吧,哎,String怎么写,你就下边怎么写就行了啊,诶把这个数组元素呢放在它里边,那我就先把这个,诶release呢先造出来。A list,这就你还写E类型啊,At least,你有一个a list。哎,这不就这样吗?最终呢,要返回的其实就是这个意思了是吧。好,然后呢,我们是不是就遍历一下这个数组,添加到这个里边就行了。对,你用迭代器也行。哎,用迭代器不行,彩要便利它了是吧?数组呢,不能用迭代器啊,那使用发循环吧。换一环的话呢,我们说数组也可以用增强for了啊,那就E类型的一个小E呗。这样按利点艾特一下。是不是就可以了。
47:00
哎,就这样啊好,然后呢,把它呢返回一下就行。啊没问题啊行,这个呢,我们就写完了,写完以后的话呢,我们就可以呢去调用啊,咱们回过来啊,到最后这啊。这个咱们相当于是叫诶测试泛型方法的使用啊。哎,这个该。五啊。好,那这块呢,你看我们这个order,哎,我得用order去调了啊,这个order呢,本身咱们用不用发型呢,其实都没有关系是吧。或者我这块呢,我写明吧,假设呢,你看这个位置,我写的就是顿。哎,我叫ORDER1啊,又一个这个order。哎,我这写了个string,那问啊,但是你看我现在通过order点一呢去调,这个叫咱们刚才写的一个方法,跟我这里边儿写的是string有关系吗。没有是吧,对,因为你这个order这块是T,我这块呢是不是E呀。咱俩一点关系都没有啊行,那回过来以后,那我这块要写的话呢,那意义是什么类型呢?那就看你自己怎么放了。
48:00
哎,比如说提前这块呢,我们就哎阴提。我就用in特尔这样的一个数组了,哎,你有一个英特尔类型的一个数组,然后这个位置呢,我就写了这个,咱们就自动装箱一下吧。哎,行,这呢,我就五个,这其实是自动装箱了啊,五个音了,然后呢,我把这个嗯AR呢往这一扔,这时候呢,它就能够识别哦,你这个E呢。是吧,那个E呢,是一个类型的。啊,这你看这个快捷键还记得吗?我现在这一点就进去了,你想回来怎么办呢。Ctrl alt加个左对这个呢,其实很好用啊,或者说呢,大家如果要有鼠标的话呢,有那种游戏鼠标这块是不是有两个按键啊。这个按键呢,你点这个。呃,点这个呢,就相当于这个CTRL加个左一样。诶,我这个鼠标就有这俩按键,所以呢,操作起来很方便啊,我们经常让你去切换这个代码,想看相应的一些源码是吧,相应的方法怎么写的这个呢,直接就点这个按键就行。OK啊行,我看有同学呢,这个用电脑的时候呢,个别同学连鼠标都不用是吧。
49:04
鼠标要不用肯定是会减慢你开发效率的。啊,你虽然说苹果的那个控制面板比较好用是吧,但是那个你出去这个去个咖啡馆装一装啥的可以是吧,开发的话呢,还得整个鼠标啊。肯定还是会更快的。行,这个拉回来啊,这个时候呢,我们指明是in特了,所以呢,哎,这个方法的反应类型,这个E呢就是in特,进而你看我这块呢,Alt加个回车,自动给咱们生成的这个list里边呢,这就是了。啊,这个注意没问题,好,那这块比如我们用增加for循环遍利一下啊,这就特的这个I啊list。哎,打印一下我们这个I这个呢,已经是一个例子了,里边呢,放的其实就是这五个元素了,哎,走起啊。哎,没问题是吧,OK啊行,这个呢,就是我们说的这个翻译方法和调用啊,通过这个调用呢,我们起到一个点。啊,提他个点啊,嗯,就是我们在这个调用这个方法的时候呢,指明它具体类型,那么下个问题啊,当然你说我们这个泛型方法,刚才咱们在奥里写的啊。
50:07
这个方法能声明成静态的吗?咱们刚才说呢,你要是使用类的这个泛型参数的话呢,不能是静态的是吧。那他能是静态的吗?哎,你看我们要加的话呢,这些同学那加哪儿是吧,加哪儿你就试试,比如我加这。哎,加这,哎哟搞错了是吧,不行不行,那就往前提加这。可以可以那就行,你这样试试都行啊,其实呢,我们要放在这个前面啊,就是这呢,都是属于这个一些修饰符了。好,你看呢,我们这个方法呢,声明成是一个static是没问题的,那就说明呢,不影响它的一个调用哈。诶,那这呢能理解吗。啊,上面不让用呢,是因为我们实例化的时候呢,才能指命T是吧,而这块儿的话呢,你是一个静态的。
51:00
我是调方法时候指明的,那你谁来调那就无所谓了。啊,你要加类就类来调,你要不加类就对象来调,总之的话呢,你在调的时候呢,指名义的类型就行。所以说这个方法呢,是可以生命成静态的啊。哎,这个我就注释掉了啊,看你需不需要了啊,回过来这个我们在这个说明这块呢提一下啊说呢泛型方法可以是啊,静可以生命为是吧。可以根据啊需要啊声明为啊static的这呢是没问题的啊,好还有问题啊。这个我们当前这个方法呢,叫泛型方法,这个类呢还是个泛型类。这是T,这是E,它俩其实没关系。换句话说,我们这个泛型方法所属的类。是不是个泛型类有关系吗?没有关系是吧,哎,你比如说我们这个方法呢,这个反应方法哈,CTRLC一下,咱就随便举个例子,就以当前这个为例吧,它呢不是个反应类,那我现在呢,CTRLV粘过来是不是也完全没问题。
52:04
哎,对的啊,所以呢,就是因为本身呢,我跟你这个类的泛型就没关系啊,所以说咱俩就不是一回事,哎回过来啊,说泛型方法所属的类是否是一个泛型类都可以是吧,比如说跟类的泛型不泛型没关系啊。好,这个呢,就是咱们所谓的这个叫泛音方法啊,诶那什么时候我们会用这个泛音方法呢,就是我们在定一个方法的时候呢,如果这个类型呢,会有不确定,那我们就定义成泛音方法。很突然,跟没说一样。是吧,本身泛型的不就意味着不确定嘛,所以你什么时候用呢,那就不确定时候就用,跟没说一样,哎,说白了就是我们还最好呢,举个例子啊,让大家感受一下这个泛型方法它的一个使用场景。啊,不管反应方法了,这个反应类呢也是一样,咱们除了在集合当中能够体现到之外呢,说还有哪些位置,我们以后呢,自定义的时候呢,可以去使用这个反应类呢。那咱们可以给大家举个例子,OK。
我来说两句