00:00
好,再看,那么看看下届他干什么呢?下届。呃,这下界了是吧?朱鹏这个天蓬元帅下界了,那什么呢?Java范型里表示某个类型是A类型的负类式,使用super,但你看T。Super a表示这个类型是A的什么呢?负类型,负类型如果用通背符呢?相当于是问号,Super a同学们应该还有一点印象。啊,可能有些老师可能这讲了,有些老师可能没有讲,如果没有讲,你这听一下就可以了,那么这个这种下届在开里面是怎么写的呢?它是反过来是大于等于,你可以理解什么呢?就是我这个T要大于等于零,是这意思吧,那大于等于零显然就是我是你的负类型吗。这个符号还是很形象的,如果要大于等于你,那就说你我比你大,那肯定我就是你的负负类。
01:00
当然我也包含你,因为这个冒号呢,你可理解成大于等于。啊,等于等于好,这是它这个话,如果通配的话呢,就是下划线这个写法好下界我们说到这,那现在看案例,直接按案例说话了,啊,还以刚才这个鸟说话。还以刚才那个鸟说话,那么我们看这个代码,来,同学们看我这边一样的,同学们看这里啊,这有个20地球animal bird,它是继承了它,Animal继承了20,没有关系,没有问题,然后我单独写了一个moon月球啊,月亮。月亮就是月亮这个类,它呢不跟任何类发生关系,是个独立的。现在请看这边的代码,我把它改了。我把这个T改成大于等于animal。大于等于animal,那么同学们来看一下这段代码,我大家看啊,我这T大于等于animal,然后呢,我这个地方这个since就没有调上的。
02:05
大家知道为什么我这儿不叫上了吗?因为。Animal它是有有这个上的,但是你不敢保证animal的父类都有上吧。但是我为什么前面那个子类可以掉呢?因为父类有的方法子类。你只要没审审实有的,我当然就可以调,所以说这呢,我就把这个甚直接返回去的看区别,然后我这调到第一个方法。我先用这个方法拿到了我的一个集合进行map,在map里面调上。大家看这个有没有问题,二是不是animal的play OK。OK,那么我们又把animal传给了。传到这里面去了,他看T大不大于,大不大于等于anymore呢也是大于的,这个也OK。可怕的问题在这里,同学们,我在这里传了两只鸟进去,你们感觉。
03:04
对还是错呢?就是这个bird,这个bird传给这个animal bird是它的子类,对不对?按理说这地方应该报错,但是实际情况这个也是对的。这个很难理解,后面呢怎么理解这个东西呢。很多书上都有说法啊,我觉得一个理解呢,要看懂,只有看一个东西,它是这样子的啊,同学们这个贝的传进去,从他这个语法上呢,我们不能按照这个上界的这种方式来推,它是这样子的,如果传的是animal的子类,他也可以接收。但是他会按照animal,按照它父类的方式来处理。复联方式来处理,而且更可怕的是它这输出的这个声音还不是animal叫还是鸟叫,这个就更难理解了,那么这样子啊,我现在再说大家可能就有点害怕了,我给跑一下,我给你们看一下这个到底是怎么理解啊,这个东西到底怎么理解,我们先把这个能理解的理解了,然后把不能理解的呢,我们单独的拿出来说来,朋友们,现在呢,我们呃,新建一个案例,不要跟他打架,因为有些语法呢,这个设计者我们学的是别人设计的东西。
04:24
啊,所以说只要是人设计的呢,都不一定完全能够跟你想的一样,他可能有他自己的,呃,设计的一个理念啊,有些甚至我们都不好理解为什么这么设计,对吧,但是他就这样设计了。那么我们写个叫lower lower。Bos demo01demo01好,同学们,我们把这个代码给大家跑一下啊,来吧,呃,因为时间的关系,这个我肯定就不再不再去写了啊,这个再写一下。你这就十分钟没有了啊,这代码对我们来说都是很简,代码都很简单啊,然后呢,这有个主主方法,主方法呢,我们先来看第前面这部分,前面这部分对我们来说毫无压力,毫无压力没有任何问题,好那么这个时候呢,我们这个方法啊,这样写就可以了,刚才不是咱们写了一个方法吗。
05:17
就这个方法稍微改一下就行了,这这个刚才写的这个上届的第二个案例里边,把这个拿过来用一下。好,我就省点时间。把这拿过来,拿过来过来我就做一件事情,做件什么事情呢?把这个换成大于包好。好大于冒号,好,那这边呢,这个Bo animal,看是哪个地方有问题啊。Animal,哦,这个地方引错了。我重新来一下。啊,重新来一下这个地方,我们看看这个map啊,它引的地方是有问题的上。呃,为什么会报错呢?不应该报错呀。
06:03
看一下。呃,看哪里有问题,这个有时候它是没有问题的啊,他是有时候自己会。Map后面的括号咋了?哦,我我现在跑一下。这个应该没毛病,OK,好,我先把这个注销,看看他这边有没有报错。运行一下。好,他报了一个这样的错误啊,他说呃,少了一个这个上司,按理说这个是没错的,对不对,为为什么那么激动干嘛。好,把它写过来看看,我重新写一下啊,Map。下划线点上。Sound,诶,他还真报错是吧。
07:00
Map since大于等于bird。看哪里有问题呢。Map下划线调出来sound。UND。这个应该没错的,对吧,看看哪里写错了。哦哦对对对,呃,不好意思啊,这删错了,这个本身就不能掉,那么我讲到这刚好说一下啊,他为什么这样不让你掉了呢,是因为。他是这样理解的,这个代码怎么理解?他说你animal animal的确有上。有上,你原先调是可以的,原因是因为你animal有了这个上,他认为你的子类都是有可能继承的。这个肯定,但是你现在是一个下界了,你现在写的是下界,下界呢,他没有办法确定你这个T到底是什么类型。所以他没办法去确定你这个animal的负类到底有上还是没有上,因为的animal的那个可能有上方法也可能没有。
08:07
但是他在为什么你下届这样写,这样写他就没问题了。这样写,这样写它就没问题了,是因为。编译器他可以去确定animal的确有上,他有就确定你下面的子类有上,所以说他认为是OK的,但是你反过来写,编译器无法确定,无法确定它就不让你掉,所以说你这我们就不掉,不掉就完了,不要这边我们就打开了,在这地方呢,我们就可以用好,那么现在呢,我们看啊,这个地方是满足下界的。下界的这个约束的类型约束没问题,这地方呢也满足下界的约束,这个也满足。满足下界这个呢,也满足下界的,两个都满足,因此在这地方我们一直行的代码肯定是正确的。
09:00
他会发出这个hello和我们的animal上的正确。下面我们再来看移动代码。好,这段代码有点不好理解了,我传一个bird。Bird,我再传一只鸟进去。Bird好,这个时候这个bird呢,人家一发现bird也确实是有的,但是你会发现这地方居然没有报错。按理说你的类型不是他的。那个那个负类型嘛,但是其实的话,你会发现运行也是正确的,那这个就涉及到一个理解的问题了,就到底怎么理解这个问题。好,你看它仍然是说鸟叫,鸟叫,那么怎么理解这个东西呢?这里啊,并没有报错,这里我们不能不能使用上界的上界的这种思路或者思路思维啊,思路去推去推导。啊,不能使用,上节说这里是正确的,这里是可以运行的,那么怎么理解这个东西呢?好,看我的一个结论,这个结论我就不啰嗦了啊,直接给你,给你们拿出来,这有一个文档,我直接把这个文档拿出来给你们看。
10:15
呃,这些没有用的东西我就不看了,我直接把最关键的地方拿出来。就看这里。这标标注成红色的看一下就说如果是如果是这个下键可以随便传参数。那么这里有两个约束,只不过和animal直系的,是按animal父类,是animal的父类还是负类处理,如果是animal的子类,按照animal去处理。但是这里有点不好理解的是,如果是an animal的话,嗯,大家认为。大家认为应该这两只鸟呢,应该发出安的叫声才对,但是他仍然是发的鸟叫,待会我们留一个尾巴想这是为什么,这是第一个结论,第二个和安利无关的,一样可以传进去。
11:05
Anyway,另无关的也能传吗?的确也可以传,你看同学们,我再写一段代码,我直接传一个这样的东西,你们看也是没有错的,这个有点就是不能按照以前我们的推法,我这里传了一个什么呢,不稳。Moon moon这个是个月亮,但是你看到我穿进去,它也不报错。当然这个时候你再去调这个map肯定是没法调了,你这个时候它它下划线这个上的这个地方你去用。你去用sound这个肯定不行,因为它能够检测到你这个默是没有上的。因为编译器还是不会那么傻的看,诶根本没有,除非你说老师那我这写一个呢,你写一个当然他就没问题了,诶写一个我们看看是是不是多了一个什么玩意儿啊,多了一层,多了一层。好,你看这个就呃这地方。
12:03
哪写错了啊,这就少写了一个D啊,你看这个地方map我们这传一下,诶诶上它还是不能行,不能不能调吗?点so用调不出来是吧,它应该检测到是个木纹呢,检测到是个木纹才对呀。我看看这词是怎么理解的啊。呃,看这里。他不能解析。不能解析木纹是个商方法,那就那就是这样子了,它这样还是在这,它不让调,那我先待会先放在这啊,先放到这儿,我们看这个船是没问题的。船运行是没问题的,先看一下。好,先看一下这个传一个木纹进去有没有问题,传一个木纹进去呢,它并没报错,的确是接收到了啊接收到了,嗯,只是我这做一个扩展,可能是我待会再说这个事情啊好,嗯,也也就是说这里面我们可以看到,如果是和animal无关的,它默认是按object来处理。
13:09
那如果按照object来处理的话呢,可能他是找object里面,看object里面有有没有一个上方法,好,我们先把这个结论放到这。放到这里面呢,有一个问题啊,同学们,我先把它写到这来,有一个问题要给他解释一下。不好理解的地方是这。哪里呢,同学们,看你这传了两只鸟进去,你传了两只鸟进去,你会发现什么呢?你会发现它发的是鸟叫,不是动物叫,再执行一下。好,看这里。传的是鸟叫的声音。你看是bird bird,那这个怎么理解呢?好,要理解这个的话,我们要去这样做测试,怎么测试呢?大家看我这有个幻灯片,我这里做了一点说明看,如果我们用这个方法直接去输出它返回的这个类型,实际上是一个案例。
14:06
就在这体现出它,它也就是说它产生的bird呢,这个对象实力仍然是bird的。但是他把这个引用实际上是传给了安利姆,他在调这个上的时候,只是相当于我这个方法去怎么样呢。覆盖了阿的方法,那这个怎么来看这个引这个情况呢,同学们看啊,我现在呢,给给这个情况只能在我们这个地方才能看得到,我用scan给他打一下。给它运行一下,看一下效果。好,同学们,我们来看看是不是他们返回的类型跟我们想的是一样的,首先呢,我把这一段代码拿过来执行一下。好,我干脆把这个木纹一并拿过来。啊,一并拉过来,我们看看到底它是怎么处理的粘贴。好写完了,也就现在呢,这边都写完了,我们来跑一个东西,那就快速的来跑一下啊,我传一个这个东西进去,我看它返回的是什么。
15:10
我看返回是什么,注意看代码粘贴回车。哎,这地方方法是不是还没有定义啊,把这个方法是不是定义一下就可以了。把这个方法粘过来。这是我们定了个方法,好,有了这个方法过后呢,我再去粘贴这个传bird的这个方法。粘贴回车,好,同学们可以看到此时此刻,你看它实际上是让一个animal这个类型自就是相当于你有两个bird,但是你把这个bird传给什么,传给animal,然后你在调上的方法的时候,其实相当于说。调这个背的时候他还是去找,但是因为你覆盖了安方法,那么我们再来看第二个,比如我传了一个木纹进去,我们看到实际上返回的是什么类型。走一个粘贴一回车,哦,原来明白了,如果传的是跟他没有任何关系的,它返回就是object,那么我们再来看一个这个类型,如果是子类,它的它的父类。
16:15
有时就是animal的负类,它仿的是什么呢?诶,我们再来看,这时返回的就是。二字本身。哦,他原来是这样子搞的一个逻辑,就他的下界。他的逻辑是怎么处理的呢?其实就是老师说的。和这样写,和animal直系的是animal的父类,还按animal父类处理,比如说20是animal子类的。就按animal处理,但是这里面涉及到一个什么呢?如果有方法覆盖,那仍然是调用的之类的啊,这边如果有方覆盖,那那也就是说那就是什么呢?假如我们这个安利bird里面没有没有这个上的方法,我们可以看一下它调的是什么声音。
17:02
啊,假如这样干了一票啊,假如这样干了一票,注意听啊。假如我这样干了,一票我保存保存呢,为了好看呢,我先把它处理掉,也就是说你现在为什么这掉上的也能成功。对吧,你要算的为什么成功,因为他其实是按照安来进行这个。这个这个继承关系的处理的,那么我传了两个鸟进去,我这仍然掉上的成功了,因为我继承了你,那这个时候它会发出什么声音叫呢?显然我们认为应该发出的是动物的叫声。动物的叫声,因为你这没有上脑,没有重写别人的嘛,那么我们再来跑一下代码。看这里啊,主要是看这里到底发出的是什么声音。那我们为了好看,给大家在这儿加一个这个注释啊,同学们不着急啊,不着急讲了咱们就尽量把它说清楚。好,同学们看,我们一运行过后呢,我们发现的确是发出了。
18:04
动物的叫声,他是这么一个逻辑,因为你这个bird呢。他已经没有这个方法了,如果你把这个贝打开,那它发出的声音呢,就是鸟叫的声音。再看一下。哎,他是这么一个逻辑来处理的。倍的声音,好,那这样子我们就能对这个理解的这句话理解的更清晰了。那么如果你是和animal无关的这个这个对象怎么办?一律按object处理。这就是为什么我们刚才叫这个木纹,你叫这个嗓子吊不起来。直接调是调不起来,因为他在编译的时候,他按这个object里面去找,他说他说没有上的方法呀。那你就写不清,写不上去了。好,这就是关于我们这个下界的一个说明,大家看理解了啊好,现在呢,我把这个下界再给大家整理几句话,大家注意听一听就可以了。
19:01
关于开下届的使用小结。我一共整理了这么。五句话,大家注意注意听一下第一句话,这是它的格式,第一句话对于下界,我们可以传入任意类型都能接受。你什么都能穿,其实这地方呢,就是我这说的这句话,不能用上界的思路来推,类推下界的含义,很多书上包括一些老师。都直接说这个是它的负类才能传进去,没有做测试。啊,你们要是有心有兴趣你们去看,呃,有些地方是讲的,有时有有点小问题。啊,那么这是第一句话,第二句话传入和animal直系的,那传入直系有可能是它的父类,有可能是子类,如果是父类,那就按父类处理。如果是子类呢,那还按animal处理,但是这个animal处理呢,也有一个条件,什么条件呢,就说如果你的这个子类有有重写方法呀什么的,那他就掉的还是他纸类的方法。
20:02
只是它那个引用就相当于我们原先写的那个把一个指令交给的那种感觉好,那么和animal无关的呢,也能扔进去,一律按object处理,就是刚才我们打的这个东西的话,大家还有印象,就这。就这个,你穿了两个,穿了一个木纹进去也可以。啊,你传一个任意其他他都按object来处理了,那么。也就是,也就是,这也就是下界可以随便传,只是处理方式。不一样,根据你的这个类型不一样而不一样,好同学们,那关于下届呢,我要讲的也就是这些了啊,虽然说呃,我觉得这样讲呢,可能大家对下届呢,应该理解的更清晰一些了啊,清晰了,好同学们,我把下届这个案例给同学们简单的反述一下啊,刚才我们讲的是下届,来聊两句。啊,讲到下界,我们看看,首先把下界的概念给大家说一下。
21:01
诶,下贱。给他聊了几句对吧,第一个下届的标题三。啊,说了一下Java里面的下界,它是怎么玩的呢?它是这种语法,好,Java下界讲了过后呢,我又给同学们讲了一下,开了里面的下界。他的一个写法对不对,是开了下界,用了一个小箭头对不对,好然后呢,讲了一下他的这种语法,语法好,然后呢,这个讲完以后,为了加深大家的认识呢,我写了一个开了下届的应用案例。啊,加深对它的理解,那应用案例呢,代码我也给大家整理到我们的理中,就是这个这个案例大家呢,有兴趣自己再去试一试啊,啊再去试一试,好,这是我们讲的下届的案例,对。那下届的案例讲完以后呢?为了增强对他的认识,我对这个案例做了五点的一个整理和说明,就是SC中下界使用的小节五句话。
22:05
啊,五句话呢,不是很深,不是很深奥啊,但是呢,也能把它说清楚好说说这个语法呢,就这样子的啊,就这样子的好说清楚,大家又觉得没什么,但是说的不清楚呢,你就一脸的这个懵了啊懵了好第一个。第一句话。第二句话。第三句话。第四句话,第五句话,那么我再说一下,你们要去查看呢,需要用这个工具来看,不然的话你很难看到它底层到底是怎么跑的啊。用这个工具去看,大家看这里呢,也很清晰,我返回的是什么,返回的是什么,返回的是什么。好的,这是我们对它的一个理解。好,那关于我们撕开了的下届呢,我就先讲到这里。
我来说两句