00:00
行,那接着的话呢,我们提一个叫泛型方法,泛型类,泛型结构,完了还有一个呢,叫泛型方法,什么叫型方法?我们先来看一下咱们集合当中存不存在泛型方法,Ctrl shift t,咱们找一下叫collection,以它为例点开进来,那么我们在声明这个接口的时候,咱们这儿呢,有了一个这个E。好,这是它这用的是E啊,然后往下走,往下走的话呢,我们会看到这个,呃,包括像这个方法啊,这块这个方法啊,还有咱们的。这个方法或者以它为例吧,这是发音方法吗?哎,我们要说这不是啊,不是说呢,你这个方法中使用了类的或者接口的泛型,这就叫泛映方法不对。这是一个普通的方法。谁是泛音方法,刚才错过了,它是。
01:01
它是泛行方法,你会看到这个里边是不是就出来个T呀,这个T跟咱们这个接口声明这块这个E啊不一样啊,你这是叫E,你下边这个结构当中用E的位置,它一定也不是泛应方法了,方案里边你要用E了,这不是反应方法,那你泛型方法呢,是它额外的又有一个新的一个标识了。跟你上面那个E呢没关系。或者换句话说,我这个呢叫泛型方法,这个泛型方法所属的类或者是接口是不是带泛型的无所谓。啊,我这个泛型方法所属的类或者接口是不是带泛,是不是泛行的无所谓,没有要求,这个泛型方法只是针对于我来讲的,这个方法呢,我不太确定。啊说呢,我这呢,像别的方法这写个string啊,写个inte啊,都是非常确定的类型,而我这个方法呢,我不确定可能会放什么类型的这个这个结构,所以呢,我这个方法呢,就可以造成是一个反型方法。
02:10
啊,有点晕,那咱们举个例子,我还是放在这个order里边,首先呢,需要明确的就是我写的这个方法,这个方法包括下边这个twoth string啊,To string,这呢我们说明一下,说如下的三个方法都不是反应方法。哎,这个呢,先明确啊,不是说呢,你这个方法当中使用了类的泛型,就叫泛型方法,这不对啊,什么叫泛型方法。哎,翻译方法呢,就是在这个方法中,然后呢,出现了这个,呃,出现了这个叫什么泛型的这个结构。啊,泛型的一个结构,然后呢,这个呃,泛型的参数。
03:00
啊,它与咱们这个啊类的这个泛型啊参数呢没有任何关系,咱们比如说我下边定一个这个呢,哎,你上边这个类的泛型用T,我下边呢,我就用E,跟你没有任何关系,或者换句话说,换句话说呢,就是泛型方法,它所属的类是不是泛型类。啊,都没有关系。说白了就是我这个方法啊,咱不是说这个,呃2.1,它不是一个反应类吗?我在这里边去声明也是一样的。那现在呢,咱们先写到这里边体会一下啊,我现在来写个方法,还有这个想做个什么事呢?嗯,我们想做这样一个事吧,我这呢叫copy。Copy复制from a to list。我在这个行三位置指定一个数组,把这个数组中的元素呢,一个一个的给它取出来,放到一个list子当中,然后你把这个例子呢给我返回。
04:10
那行了,现在呢,我这个数组放在这儿,那么数组是什么类型呢。不确定,我可以是string类型,也可以是int类型,还可以波尔类型,什么类型都可以,那我这块位置,我当然我也不想写成object类型啊。我不道,可能。那可能里边有一个int,有一个string,有一个别的乱的是吧,咱这呢就是具体的某种类型,我这呢,我就写成个E类型吧。E类型的一个数组。这个E区别于咱们上面用的这个类的这个反形T啊,它俩是不一样的,跟你上面那个有没有T没关系。啊,那么我这这样写的,那你这块你返回的这个呢?哎,那你这是一个E参数的是一个,哎,就是相当于数组的元素是E,那你返回这个list是不是也应该是它呀。
05:02
这样,但是这样呢还不对,这样的话呢,我们的编译器会误认为说你是不是有一个类基叫做E呢。他不会把你认为是一个泛型参数,他会就认为你这呢就是一个类型。就好比你这个E呢,就是string一样,他们认为你有个类就要的E。咱现在其实不是,它是一个变量是吧,回头我们调的时候呢,我想把E当成是string当成是啊,那怎么能表示这个事儿呢?在前边呢,我们需要加上一个间括号,这个间括号里边呢,就写上你这个参数E,这个时候呢,他会知道哦不是有一个类角E。啊是你这是一个发行参数啊,当你调这个方法的时候呢,你把这个E是什么类型的指定就可以了,这呢我们要加上一个它,哎这里边怎么去写比较简单了,我们去a list,这呢就是个E呗。
06:00
List new,一个a list,哎,这么着,然后我们写个for循环,这呢就是E的一个E冒号A,通过一个遍历,咱们把这个list加进去,这个小E在这呢,我们做一个return啊,这个list。这个能看懂是吧。通过一个for循环,咱们把这个数组的元素呢,遍历了一下,加到咱们这个例子当中,做了一个返回啊就结束了,这个方法是泛行方法,是泛型方法,好,这个我写好了,写好以后呢,咱们调一下。咱们在下边这块去写。哎,这个呢,咱们来测试泛型方法。行,那么这个方法呢,咱们写到order里了,而且呢,这个方法呢,呃,也也不是一个静态的了啊,咱们呢,回过来这个我们首先呢,还得去order造它的一个对象,比如说我这个order呢,我写成是顿的,哎,这地方叫order等于new一个。
07:09
Order这个呢,大家就应该都清楚了,那现在呢,我通过这个order呢,咱们去调这个叫from a copy copy from a to list这个里边我呢放一个in teacher类型的数组。我故意呢,让你看出来这两个T,一个T一个E,我就用不同的类型。我把这个呢AR呢扔进去。你看这时候呢,就没有问题,那么返回到。返回的啊,这块他看不到了,这块还是咱们声明的时候的情况啊,那你直接呢al enter得了,诶返回的就是这样的一个list。那么这个list呢,你会看到它就是integer,这个inte是由我们放进去这个数组的这个类型决定的啊,那接下来呢,你可以去便利咱们这个list就可以,咱这呢,就简单的去直接调一下啊。
08:03
哎,我们得到的这个例子就是你原来数组中的这个1234啊,这没问题啊,咱们主要关心的不是方法体怎么写的,主要关心的就是咱们这个叫泛行方法的调用,泛型方法在调用时。然后呢,指明这个啊,这个泛型参数的类型,这个类型和我们这个类的泛型没有任何关系。啊,没有任何关系,完全可以把Intel再换成其他的各种各样的类型,往这放都OK。啊,都是OK的。这个能理解不啊?体会一下这个问题啊,然后呢,你看咱们刚才提到说这order这呢,咱们写的这叫发音方法啊,这个发音方法呢,咱们说跟你这个类是不是泛型的没有关系,那我把这个类方法我CTRLC一下,咱们这个类不就不是泛型类吗?我这里边呢也能够放进来。
09:04
啊,那就相当于我拿着这个对象去调这个方法的时候呢,你看你想操作的是什么类型的一个,呃数组,那你就提前告诉我这个类型,这个类型确定好以后,就决定了我们返回值的这个E的类型。啊,它其实都是表示的是一个参数,这个参数呢,是一个类型的意思啊,就是拿一个类型去复制成,这是我们说的,呃,这样一个问题啊,那么回过来不妨咱们还在这个位置去说哈,这个方法呢,叫泛型方法。刚才我们说在类啊,这个泛型类的这个方法当中,这不是反应方法了哈,在这个方法当中呢,我们是不可以使用把这个方法声明成static的。因为这里边儿用到了你这个类的发型。你要没有用这个T,那OK。那想静态那就静态啊,那但是你要用上类的泛型就不行了,那问这个方法叫泛型方法,它可不可以是staic呢?
10:05
哎,你就分析一下他会不会有一些这个矛盾啊什么的是吧,我这加上TE柯南。我加到这。放到前面得是吧。是不是可以啊,那么你想,哎,为什么可以啊。哎,对,哎,大家那个,诶说的我看有同学听到了啊,说的是对的,就是咱们上边这个呢,你塞这个这个T还没确定呢,而我这里边儿这个E跟你那个T是不是也没关系啊对,我这个E呢,是在我调用的时候。是不是确定的。哎,咱们在在这块写的啊,我是在这个调用的时候确定的,那调用的话呢,我不管你是对象调的还是内调的。对我来讲不重要,只是呢,你掉的时候你告诉我啊就行了,哎是这个意思啊,呃这个,呃这块报错原因是什么呀。
11:05
就是你这两个方法同名同参数的,其实要么都是sta这个,要么都不是,咱们原来讲静态那块的时候提过这个事儿是吧?哎,那你负类当中加S这块呢,就也加上得了啊,这是可以的啊,所以这块呢,我们强调一下吧,明确说一下啊,说泛型方法呢,哎,它呢是可以声明为哎静态的啊主要的原因哎就是呢,这个泛行参数啊,是在这个调用方法时。调用方法时啊,这个确定的啊,并非在这个实例化时确定,实例化类时确定啊,那这块我们就根本用不着啊,说你这个非得实例化的时候才能掉啥的啊,我静态呢,我就用类去掉就完了啊成这呢,就是咱们说的这叫翻行方法啊,就这样就完了。
我来说两句