00:00
然后我们再来介绍一下泛型的一个特殊用法,那就是泛型的限定,那这里比较常见的一种写法是泛型指定上下线,所谓的上下线的指定呢,非常简单,就是在泛形定义的时候,后边加上大于号或者小于号。和冒号,然后再跟另外一个类型,那这样的话,比如说这里我们定义的T后边小于冒号person,那大家其实知道,既然是小于冒号,那相当于就是说当前的T的类型不能超过person,也就是说person是它的一个泛型的上限,T的类型传入的泛型类型可以是person的子类,或者是person自身。那同样,如果要是说当前定义的时候是大于冒号person的话,那就表示person是它的泛型下限。T传入的类型可以是person,也可以是person的负类,但不能是其他啊,这就是相当于对于传入的泛型进行了一个具体的限定,那除此之外呢,另外还有一个比较特殊的用法,就是所谓的上下文限定,那这种用法呢,就是没有大于号小于号,直接就是一个冒号,比方说我们这里边直接定义的时候,A冒号B,这指代的是什么样的一个泛型呢?首先A是泛型的名称,然后后边的B呢,它其实指定的是一个影视参数的类型的名称。
01:35
而这个隐式参数呢,它又以A作为它的泛性,哎,所以这里边大家会看到就是A其实是指代了后边我还要传入的一个隐式参数的对应的那个类型,所以管它叫做一个上下文的限定。当然了,如果我们把它展开写成这样的一个影视参数的传入的话,那后边我们可以调用对应的这个影视参数可以直接使用啊,就是这样一个BA类型的一个参数,那如果我们写成了上下文限限定这样的一个形式的话,这里面就相当于没有参数了,那没有参数对应的这个B类型的参数,影视参数又怎么用呢?那就要用到之前我们提到的implicitly这样一个省略参数名称的直接调用的方式啊,这种使用是相对比较特殊的用法,大家只要稍作了解就可以了。接下来呢,我们可以在代码里边测试一下泛型的上下线。
02:33
我们还是在目前对于泛型genes这个测试代码里边啊,稍作增加,那我们想到了,既然我们接下来是要做对应的一些测试啊,那这里边这个parent child这些都可以通用,我们就不再重新去做定义了,下来我们直接来测试上下线。
03:02
首先这里边我们可以立一个函数,关于这个上下限,不光是我们在定义一个类的时候,可以把它的这个泛型上下限定义,另外呢,定义函数的时候也可以直接给上下线啊,比方说这里边我们定义一个。主要是要测试这个上下线啊,这边给一个形泛行,比方说叫做A,然后呢,我们把它的上线立成里面,当然就可以传入各种各样的参数了啊,比方说我们就传一个。A参数名称叫做A,那么它的类型,那我们要用起来传进来的泛型了啊,要不然的话这个泛型没有用嘛,所以一般情况啊,函数在传入泛型的时候,当前这个泛型都会出现在参数类型里边unit,好,接下来里边非常简单,我们直接把当前的A,我们可能最关键的是想看到它到底是属于什么类型,我们可以at bus,然后内把这个做一个打印输出,有了这样一个函数定义之后,接下来我们就可以来测试了,来看这个test在调用的时候呢,前面就需要去给一个当前啊。
04:18
对应对应的这个泛型。当前我们定义的是上限是child,如果说我们传入一个arent的话,然后里边比方说我们又一个当前的呃,A类型啊,我们直接给一个票,直接这样的一个调用的话。我们可以看到这里直接报错了,为什么会直接报错呢?哎,那就是因为我们要求的上限是child,那这里边parent显然超出了这个上限。那所以就即使我们里边传入的这个对象是一个child的对象,这也没有用,对吧?啊,我们这里边相当于是传入了一个票的类型的对象,然后又把它赋给了一个parent的指针啊,那所以最终我们的泛型还是parent嘛,当然了,如果说要把这个改成票的话,我们再来执行一下。
05:16
这就没有问题。我们可以看到打印出来当前。A的对应的这个class name是child,这是完全没有问题的。那这里如果说我把这个new的这个对象变成subil可以吗?哎,这个当然也是可以的,扭出来它的一个子类的对象可以直接传给当前父类的引用类型,那这里边我们直接判断它类型的时候呢,也会获取到当前其实是一个sub child的对应的对象,这也是完全没有问题的啊,那如果这里边大家愿意把这个类型直接改成sub child的话。当然也是正确的,也可以得到一个sub的对应的对象啊,当然如果你后边是要一个child的类型的话,这个大家知道肯定就错了,对吧?我们不能把一个负类的对象赋给一个子类的引用,这就是关于分行上下线的一个测试。
我来说两句