00:00
了解了泛型的基本概念,那接下来呢,我们再来看一看泛型在代码当中怎么样去使用,其实对于泛型而言,我们之前在集合类型的讲解过程当中,大家已经非常熟悉了,比方说我们这里边想要去定义一个string类型的array,那就把string当做一个类型参数一样,我们在定义的时候把A瑞写出来,后边加上中括号,里边填入对应的元素的类型就可以了,把string填在里边啊,那所以就相当于我们是在瑞定义啊,D对应的这个泛型全部替换成string,接下来就是它具体的实现了,所以整体使用是非常简单的。那接下来呢,我们要给大家介绍的是一些比较特殊的用法。一个了解,首先要讲解的是斜变和逆变,斜变和逆变这一部分呢,呃,主要其实就是在定义泛行的时候,前边可以加一些符号,比如说可以加一个加号,可以加一个减号。
01:00
这表示什么意思呢?加号表示的就是斜变,减号表示的是逆变。具体看定义,它其实指的是。跟类型的继承关系有关,比如说这里我们定义了一个父子类啊,Son是father的子类,那这个时候my list son和my list father它们之间又是什么关系呢?默认情况下我们前面没有符号的时候,这个表示的是不变,默认情况下他们是没有父子关系的啊,这个大家其实很好理解,就是本身他俩是有继承关系,但是如果把它们作为。泛型传给另外的一个集合类型的话,那这个集合类型之间其实是没有具体的父子关系的,那假如说我们希望他们有一些关系又怎么办呢?那就需要做逆变或者斜变了啊,斜变表示的是my list,也是my list father的子类。就是父子关系是协同变化的,父子关系是顺着的,那如果要是反过来呢。
02:03
那就是逆变了,就是son是father的子类,My list son变成了my list father的父类啊,具体我们在代码里面做一个测试,来做一个说明。下边还是新建一个scla的object test03,我们要测试的是判行英文lyrics那方法写出来,那要测试这个继承相关的关系,我们首先要定义义出来啊,把地层关系都定义出来,所以我们最关心的其实就是父子类型,所以具体的参数构造器参数和类体我们都不实现了,就把类名定义出来就行了啊,我们先定义一个父类father啊,我们叫parent吧。Parent,然后另一个孩子,这个我们也不叫丧了,我们叫child。承关系成子parent,那为了看得更清楚一点,我们再定义一个第三代out,还有孩子,我们叫subjectch child extend,什么关系先定义好,然后接下来我们要定义一个集合类型啊,定义哎,泛型的一何类型,比方说这里边我们定义一个myle,如我们定义一个my list都是可以的。
03:27
里边需要带泛型括号,括起来可以给一个T,当然了,这里边泛型的名称我们可以根据自己的喜好随便定义,一般就是一个单独的大写字母,方说我们这里定义成E表是里边的元素啊,Element的首字母也是可以的,接下来我们做一个具体的测试,结变和逆变啊,那首先我们先来回顾一下啊,在GALA里边,我们如果要是说想要去new一个。
04:03
票的,然后如果说我们想把它直接付给一个票的类型的量的话,对应的一个对象付给相关的一个引用的变量的话,这是肯定没有问题的,那如果说我们要把它付给一个子类的指针是肯定不行的,那如果说要付给一个负类的指针是成立的,那这个我们知道付给负类的指针后面就可以使用多肽了嘛。这是前提,我们已经了解过的面对面向对象的相关的知识,那接下来的问题就在于,如果一个child的对象可以直接赋值给一个parent的指针的话。那接下来。如果我们再把它变成一个list呢,或者是一个列表啊,那我们不要直接叫成list的,其实这里边是一个collection啊,就是一个集合,而说我们就把它叫成list吧,那这里边就需要去定义my collection parent,后边new的时候就是I collection,如果要是burn的话,当然这个没有问题,它的类型是一样的嘛,那假如说里边类型给的是呢?
05:25
前肯定就不对了,因为我们默认定义的这种方式是不变,也就是说child和parent之间有父子关系,但是他们作为元素类型,作为泛型传递给集合的时候,这个集合是没有父子关系的。如果说我们想让他们还可以做这样的赋值,那怎么做呢?当然就是做一个斜变面,加一个加号,那就表示要的是parent的子类,那么my child也是my collection parent的子类。啊,那对应的大家就知道了,如果要是这里是逆变的话,当然这里就又不成立了,那怎么样就可以成立呢。
06:06
不然就应该反过来。我们这里边是付给了my collection parent对应的这样一个指针,那接下来其实我们就知道了,应该是给到sub child应的这样一个指纹,因为child本身是它的父类。那反过来是不是就相当于my collection child,就是my collection sub child的子类啊,所以这样的话,我们就可以做对应的定义了。这就是关于逆变和斜变的用法,大家可以具体做一个测试。
我来说两句