00:00
下面我们再看最后一个点哈,就是什么呢?就是斜变,逆变和不变,我们先来看它的基本介绍,在开里面经常会看到这种符号,就是加减。加减还有一个加减,还有一个什么都不加的。那么如果是加号呢,就代表斜变,斜变的单词是这个单词啊,很少用。啊,很少用,还有一个逆变呢,是这个单词不可不变呢,就是这个单词不变,那么我们先做一个介绍,对于一个带参数类型的。啊,带参数类型,参数的这个类型,比如说历史的T。如果T啊,如果对A及其子类B满足历史的,B也符合历史的,A的子类就称为斜变,什么意思呢?就说A注意听,就是说B如果是A的子类。而且还满足什么呢,List。历史的加一个泛型。
01:00
它是什么呢?它是list a的一个子类,那么这种现象一旦成立,我们就认为它进行了一个斜变。啊,斜面说,即历史的A是历史的B的子类。那么如果这个关系相反呢?就称为逆变。如果一个类型支持斜变或逆变,我们有个专业术语叫做可变。就说协变和逆变可以统称为可变,否则就说它又不支持斜变,又不支持逆变,我们就叫做不不可变。啊,这是第一个在Java里边啊,同学们注意听,在Java里面泛型都是。不可变的什么意思呢?这样的list string并不是list opposite之类。就是刚才这个关系,就说历史的A,你A是B是A的子类,但是历史的B就不是历史的A的子类,在Java里面是这样子的。那么在SC里面呢,它可以可以支持这个支持这个写法,但是你要用什么呢?用斜边就能就能支持这个写法。
02:07
啊,你比如说你加一个历史的加T,这样就。只要你这么一加,那么我们这个斜变就成立了,就历史的实证,就是历史的恩利的子类了。但是你不加那是不行的,因为它没有进行这个斜变。好,现在呢,我们说这么多没有意义,我们来看几个案例,大家一看就明白了,直接看案例啊,再看你在这里我们引入关于这个符号的再次说明加号。减号表示什么意思?在十开中声明泛时,泛,泛行的时候,如果加了一个加号表示斜变,整了一个减号呢,表示逆,比如说C。C这个中号加T。什么意思呢?就是说如果A是B的子类。做A是B的子类,那么CA也就是CCB的子类,这个就叫斜面了,就就支持斜面了,如果你这个T减做了个减号,表示什么呢?如果A是B的子类,那么CB。
03:07
CD是CA的子类。看到没有反过来了。反过来了,就是它这个关系是这样子的,那么称之为逆变,逆向的变动,那么如果你写的CD,无论AB是什么关系,CA和CB都没有从属关系,称之为不变,那现在呢,我们来看一个案例,好,我直接把这个案例拿过来给大家跑一下。好,现在呢,我们来写一段代码啊,最后一个代码,这是最后一个案例,最后这个案例呢,给同学们说一下。嗯,取个名字啊,这个名字我我就粘过来吧,这个单词确实是用的非常少啊,随便逆变的一个案例。好,给大家写到这里来。啊,写遍逆变的一个案例,好,写到这儿。打一个包,写到这儿,再把这个粘过来啊,一个是斜变,一个是逆变。
04:03
好,这个单词大家可能也记不住,你也不用去记,你干脆就写遍一遍吧,写写拼音也可以好写到这,那现在呢,我们来给大家举一个案例。啊,自己写个单。啊,DEMO来走一段代码。把它体会一下就可以了,好,这是我们的一个主函数,大家看一下。好,首先呢,我这里有一段代码,这段代码呢,我们现在拿过来用一用啊,很简单的一段代码。看看一下啊,嗯,这个地方。好,我把这个地方写到。哦,这地方不要在这儿洗了。好,我们来看一下这个情况。首先呢,这是一个super,是一个负类。啊,这个很简单,呃,Sub呢是它的一个子类。啊,这个关系先把它理清楚,Sub。Sub。啊,是谁呢?是super的super的一个子类,这个很好理解,然后呢,我们来看一下,这边我写了一个TEMP3。
05:06
A。好,里面传了一个字符串。专利支付算,那么这边我重写了它的除数方法,我们来我用一下啊,这个其实就叫做不变。注意看情况啊,这个叫不变。啊,不变有什么一个特性呢,我们来看,比如说我这里有一个变量叫T1。啊,T1T1这个T这个类型呢,我要指定一下了,注意看啊,我写个TEMP3。然后呢,我写一个这样的类型,比如说呃,我我这里面指定是一个super类型。啊,是个sub也行,Sub等于六了一个temp。好,另外一个temp呢,里面传一个hello,同学们看这个代码是可以的,这个代码没有错,OK,因为你sub,我就说我我不变嘛,那sub给sub就OK了,没有任何的影响。
06:03
因为他们两个类型是相同的,但是同学们看我这个写法能过去吗?比如说题二。然后呢,我把这个改成super。同学们可以看到,这个是跑不起来的。这个你是跑不起来的,为什么跑不起来?因为不不变吗?同样的道理,你要把一个super写到这,把子类给他也跑不起来。都错。两个都错,因为它不变,所以你把他们不变的话,这两个就没有没有关系,就是你虽然这两个是有这个基层关系,但是你这加了这个泛型,他们就没有任何关系,刚才说的这个道理,他们之间没关系,所以说这两都是错的。A。好,因为他们没有这个关系,所以这两个都是错的,那么紧接着我们来写一个新的情况,做一个斜边的工作。斜变,那斜变呢,我也不啰嗦,直接粘过来一份,把它改成T4,好,这时我把这个加上一个加A。
07:04
加一,我们看这个时候又变成什么样子了,还是老规矩来粘一份。天使,大家看到。大家看到。诶,现在呢,我来一个T4啊,下面这这个虽然是T3。这个是T10T4,我们看这个地方自己给自己是可以的,这个肯定可以啊,你不变都支持,更别说斜变了,那紧接着我来看第二个写法。现在T5。啊斜变它是什么意思呢?就斜变,就说我可以这么给值了,看啊看这个含义。这是斜变的话,就是说他这个父子类的关系可以被这个范型给继承相,你看我这样写。哎,这个是啊,怎么感觉啊,不对啊,是你看这里。你看这样传进去是没问题的,为什么?因为我支持斜面,支持斜面就意味着如果我是你的子类。
08:04
我是你的子类,那么我这个泛型,这个也就支持我是你的子类了,就是这个是。可以给你就是这个就给你成立了。所以但是你反过来是不行的,大家看反过来你是不行的,比如说你把这个sub写到这儿。哎,你说这有个沙包,比如这是六啊六,然后呢,我把这个super给他,这是不行的。这肯定报错。因为。反过来了吗?啊,这个是错的,好,那么现在呢,我们再写逆变。啊,逆变,我们再来一个,再来看逆变。逆变是什么意思呢?反过来了,逆变呢,我们再写一个五看啊,现在我把这个加改成减啊,我也不去跑它了,直接看代码。老规矩,从这地方随便写一份。呃,肯定我自己给自己这是没问题的啊,这个肯定是没问题的,这是T5。
09:01
看图这个肯定没问题,自己给自己可以的,那么我们来看逆变会有什么效果呢?它这样子的题二。诶,本身啊,本身这个sub是它的子类是super,但是我现在逆变了,我就可以反过来用。怎么用呢?大家看,我有纱布。但是这边呢,我穿的是S,可以的。逆变了,当然你反过来又不行了,你说把一个sub给他,他又跑不起来,就你反过来他又不支持了。好,你看假如我这个地方改成这个,你看它一下就错了。你本身按理说这个是,诶看看这个支不支持啊,应该是五对吧,啊五看五这个地方它是不支持的啊,因为按理说这个你给他合理,但是因为你发生了一个逆变,逆变就是反过来的,就是刚才我讲的这个道理。听这个名字吗?一遍好,这个同学们以后看到这个代码呢,能够大致的看出来这个表示什么意思就行啊,就说含义是什么,当然我这讲的这个斜变逆变呢,呃,时间的关系可能讲的不多,因为这边按理说还有一个斜变点。
10:13
要大家说一下,但是同学们自己去再看一下,一一般情况下你的代码就能看得懂了,就是把这个呃,他经常会怎么用呢?他把斜变逆变配合前面讲的这个界定综合使用那个代码的语法上就稍微麻烦一点,大家要去慢慢的去体会好吧,这个。关于斜变、异变和不变,我们就先介绍到这里,那么我把这个笔记给大家简单的。这个填充一下。好,这个斜边逆变呢,也很简单,诶我们做了一个简单的说明对吧?好,那给它一个大的标题是标题二,那我讲了什么东西呢。诶,我讲了一个基本的介绍。是不是同学们我讲了个基本介绍,我说了一下是什么概念。
11:03
至少大家看到这个案例呢以后,不会说是完全的不知道别人在说什么,对吧,至少你不会出现这么一个情况。好,然后这边呢,也说了。好,然后呢,这走了一个应用实例,是不是同学们走了一个应用实例,应用实例呢,我前面做了一些简单的说明。这是标题三。表里三,那么这边的代码也做了说明。好,呃,这几个关系要搞懂,这个代码给大家放过来,好想不起来,看一下代码应该就一下就清晰了,来吧,把这个扔进来。的语法现象。要知道。啊,别看一个加法,你说你要写错了就麻烦了,对吧,所以怎么写个减号写错了啊不对,这个你要没写错好,关于这一部分说到这里。
我来说两句