00:00
诶,刚刚呢,我们把这个do呢说完了,先别着急练再优化一下啊,这个我们讲GDBC,你发现这个有各种优化是嗯,我再去新建一个包啊,就是把这个也保留着啊,要不我在上面改完以后呢,大家再看就找不着原来这个了,这又改成个三,还叫PU,哎,这我自动生成这个文件了啊把它删了,诶优化一下,优化的话呢,我们这样做,我先把刚才的这个一,哎这个123,诶我把这三呢,CTRLC我就直接先拿过来,在这个基础之上,我们去看这个优化,这些都关掉。好,这个看谁呢?先看这个叫base do base do呢,这就是我们说的这个通用的三产改查操作了啊,然后呢,我们再看这个叫卡,嗯,看customer,看看这个具体的实现这块也行啊,在这个具体实现这块,比如我们想做一个查询吧,这就做查询了,查询的时候呢,你会发现我们调的这个叫get instance这个方法在这里边竟然传了一个customer叫class。
01:04
我用应该叫竟然是吧,竟然传了一个卡点class,说没问题啊,本来就应该传卡点class,确实本来就需要传卡点class,因为呢,你操作的不就是customer这个表吗?那既然呢,这块你操作就是卡这个表,那这个呢,最好是不是就不要再去填了呀,因为呢,用户也不可能去写别的表吧,是不是也不会去写别的类吧,就我这块操作的肯定是我这个名,看这也行啊,咱们这块呢叫customer deal,咱操作就是customer c表对应OM的这个思想,过来以后就是customer这个类,既然你非常确定就是那个类了,那你干嘛还需要我专门的去。在这里边调的时候呢,传一个具体的类呢。按说就不用了。对吧,那既然不用去传了,那我们就需要做一些操作,争取呢,把这个给它去掉,那你要想去掉它,你这个方法呢,是不是我们do里的,那你就相当于do里边呢,是不是想把这个给去掉。
02:06
啊,把它去掉,但是呢,你总归得告诉我,呃,你要造的是哪个类的对象吧,因为我们这个class呢,其实我们是在这用的。啊,你看我们现在要做这个事儿,就是咱们在基础里边讲反射当中涉及到一个点获取负类的反型的问题。哎,下边我们就要把这个做一个升级了,哎,首先呢,先说一句,这个不升级也行啊,不升级的话呢,其实我们刚才写的其实也没什么,没什么说非得说不对的地方没问题,只不过呢,我们现在就想把你这个,诶这个里边呢,这个class想去掉,因为呢,对于我们具体的这些时间类来讲,它其实都非常明确的操作是哪个表了,那对应你操作类呢,也非常明确了,所以呢,这个就不想传了,那我们就通过发行的方式来体现怎么做大家看。在这个base斯do里边,在这个base do里边呢,我们去加上一个泛行参数,我叫T,然后在我们具体的这个子类当中,Customer deal in input,继承base deal的时候呢,指明你要操作的是哪个表,对应过来的类,显然呢,就是customer类。
03:18
既然你在这块指明了你操作的是customer类了,那我们此时呢,就不想在这里边去写这个参数了,哎,我在这就先去了。那你这块呢,是不是返回多个对象呢,是不是也就去了啊,那这个去了,那你用的是负类的方法,你复类方法这块呢,当然了,复类方法这块我们就也去了。这也去了。这也去了。主要呢,就这俩这个去完以后的话呢,就报错了,报错的原因就是因为你把class去了,我这块要用class没有了怎么办呢?嗯,我们得想办法获取这个class到底是谁。啊,那比如说针对于咱们这个叫customer来讲,那这个class呢,就应该让它是。
04:06
谁?应该是这样,是不是就customer,对,就是这样呢,因为是咱们写负类嘛,那个方法当然是通用的方法了,针对于咱们这个具体的此类叫customer deal input来讲,哎,你这个调get因方法时候呢,你这个class是不是就应该是customer,因为这块不是要造个customer对象并且返回吗?哎,这个就应该是customer,那你的customer在哪出现的呢?你是不是在你这个的声明时候的父类的泛型里了,那我们就可以,哎想办法获取你这个类的负类的泛型。哎,获取当前这个类的副类的泛型,我拿到你的泛型了,这个泛型对应的也是一个类型了,诶让他是不是给我们,诶负类当中的这个。Class做一个实例化呀。哎,那相当于我们在这个福利里边,咱们可以去声明一个,哎,我就诶私有也行啊,先私有了我就声明一个叫class class,哎这个我们就其实个T了啊,就叫一个class。
05:13
哎,我就声明出来了,声明出来以后,下边这个立马两个少了,就是已经找到东西了,但是呢,我们这时候其实还没有做一个实例化嘛,比如我这块先写成个no来保存一下。这块你看他还这块还包着class new instance。呃,Cannot口味的t twot,哎,这个说的是,呃,咱们这块呢,因为你是用了副类的那个泛型了,这个呢,就不再是一个泛型方法了。哎,把这个呢就去了。哎,这个就去了,就是这时候呢,咱们这个T呢,是跟咱们这个负类里边的这个保持统一的,哎,所以这块呢,它就不是发音方法了,把那个T给它去掉啊。行,那咱们这块呢,暂时写的是个no,那no肯定不靠谱,你下边class.new incent这不报错了吗?那那关键的就是我们要给这个做一个实例化,这这个实例化是谁呢?那就完全取决于你这个子类实现这个base do的时候呢,你这个父类的泛型是谁?其实我们在这块呢,呃,可以给负类里边的这个class呢做一个赋值,相当于我们在子类当中想办法调父类的那个属性,然后做一个呃赋值,但是呢,你想想我们这个子类要赋,那回头我们这块不是还建了一些叫order deal input啥的,每一个子类你要是都在这里边去试图获取负类的泛型的话。
06:31
都写一份有点浪费了,那我们是不是就可以写到负类里边,通过继承不就有了吗?诶,所以我们就把这个操作呢,就写到负类里了,写到负类里边对这个属性进行一个赋值,保证了你在调这个方法之前啊,调下边这个get方法之前,我们这class只要有值就行啊,那调方法这呢,我们是通过对象来调的,那就在调,呃,获取对象之前有这个方法,有这个属性就行,那么出现对象之前可以给属性复制的位置呢?
07:02
有哪些呢?啊,这个代码,嗯,对,就是我们看啊在通过对象去调这个方法,哎,我们那个调的时候呢,得保证你这个class有了,那相当于是你就在造对象及造对象之前,你把这个属性给附上值就行,哎,那我们是不是一方面可以显示赋值。哎,还有刚才说的代码框中赋值,哎,或者勾到其中是不是也行,诶勾到其中也行啊显示赋值呢,这个咱就不写了,为啥呢?因为一行代码搞不定,所以你你要写个竖形,那要好几行代码,这肯定不能在这走了,那就是要不呢是不是写到口到七里。那你就写一个a base DAO,诶,那你就在构造器里边去把这个class做个实例化,这个可以或者呢。或者你是不是就写一个代码块就行,静态还是非静态啊静态啊。
08:01
飞行台啊,都可以啊。你这是非静态的吧,你这是非静态的,这里边你要是写成静态,能用非静态吗?不能啊,静态结构里边是不是不能调非静态的。对,这得记着啊,哎,所以这个呢,不能写成静态的,非静态啊,比如你写这里也行,写这也行都可以,关键目的呢,不就是给他做一个实例化嘛,那我现在要干什么事呢。这个操作什么时候执行,这个操作什么时候执行,是不是我们其实呢,在测试的时候呢,咱们造的是不是你这个此类对象,当我new此类对象的时候呢,去想此类对象构造器当中又有个super空,我们要加载负类的结构,加载负类结构当中呢,是不是就先后把你这个代码块和构造器就都加载了,哎,也就是当我们在造这个此类对象的时候呢,造这个对象的时候,是不是这个结构或者这个结构就执行了是吧?那在执行的时候呢,我们要获取哎你当前这个对象的负类的泛型当前对象的负类的泛型当前对象,这次哎先获取你自己这个类,你这个类的带泛型的负类。
09:17
这呢先CTRL一下,这叫带泛型的一个副类。诶,就是这个代码啊,这个代码其实我CTRLX一下,诶你写到这块呢,其实可能更好一些,大家可能更容易理解一些啊哎,我我们造的对象是不是就它,哎这点get class.get dynamic s class,诶获取它的带泛型的类,这时候呢,是tab类型的啊是不是就它了,然后如果你要确实带泛型了,咱们当时讲这个反射的时候说过,说把它先做一个强转是吧。Para raise type。Her raised。Tap呢,那再写parater read tap这个是吧,哎,这个我们叫para的一个tap,把我们这个发行这个事扔过来。
10:10
诶,然后呢,CTRL1一下,诶强转就这块呢,其实得到是一个,诶就是你要真的带泛型了,其实呢,是可以是带泛带参数的这样一个type了,然后它这里边CTRLC第2GET叫actual type arguments,哎,就是这个方法一执行就是获取了这个哎负类的这个泛型参数了,啊那么泛型呢,我们知道说呢,你有时候可能会有多个嘛,所以这块反回来,你发现它实际上是一个数组。但实际上是个数组了,但是对咱们这个问题来讲,你就只有一个元素嘛,其实呢,就是这个数组的第一个位置呗。这个咱们不是讲发音的时候呢,都说过这个事,那讲反射的时候讲过这个问题,但当时讲的时候呢,大家把这个当成一个功能性代码就行,没有必要去记对吧?诶这样的话呢,咱们就获取了这个泛型的第一个参数了,那其实不就把customer拿到了嘛,对吧?诶就拿到它了,诶拿到它那这块呢,你给class复制,咱class在这不是看不着吗?因为你在复类里边我们不是写成个private了,诶看不着了,所以这块呢,其实这个操作我们CTRLX我就拿到这了。
11:24
这块呢,我们再做一个强转就完了。看看能看懂不看不懂,这里边有个点我问一下啊,说我写到子类当中了多少,是不是还可以啊。呃,因为这块呢,就是当前对象所在的类,不就是这个类吧,然后获取它负类的带泛型的副类。对吧,诶这个功能,那我要是把这个呢,我CTRLX我给它粘到这呢,这个C是谁是这个吗?不是了,对诶一定要注意不是了啊,这就相当于是我们账号里边这个之了,这是一个负类,这是个此类,此类呢提成负类了,然后我们在负类的某一个方法当中啊,比如说咱们还当时讲了一个person类吧,这里边有个方法叫E的方法,在E的方法里边我写个Z次点啊,比如说又掉另外一个比如说睡觉的方法了。
12:26
这个this点在这写的,那这是我们当时说过,说如果你要knew的是个person,哎,那你这个this是不是就person的那个对象,那如果我们这呢,比如说是student。我通过这个student的这个对象点我去调你负类那个一的方法,那问我调一的方法,调到负类里的这个,然后这个this这个是谁对,是不是student那个对象啊,你不会说,哎这个这怎么写到负类里边,是不是负类对象呢?不对,咱们说过你new student自始至终是不是就只有一个对象,我们也没有扭过负类对象,所以这次呢,就是你子类对象,哎,所以说呢,这块呢,我们写到这儿是没有问题的,那为什么不写这呢?因为你要写这儿的话呢,那你每一个时线类不都得写一份吗?那多麻烦,所以我们就都写到负类里了,这个Z呢,不影响你造的是子类对象,这个Z次还是你子类对象,子类对象呢,所在类的父类的带泛型的负类,哎,这样就我们搞定它了。
13:19
所以这块的操作呢,我们核心做的事就是获取此类啊,或者这个获取当前啊叫base do的子类的啊,子类啊继承的父类中的这个泛型,诶把这个泛型呢,付给咱们这个class,终于呢,把这个对于他来讲这个customer就拿到了,拿到customer以后呢,后续的这个不就呃直接我们这块去new ince,呃,Inces不就可以了吗?哎就是这样一个悲壮的一个事情,哎,稍微有点难度,考察大家这个Java的一个工地情况啊,然后改完了啊改完以后呢,我们这个回过来看这个具体时间类这块,我们只是呢,想把这个查询的时候呢,这两个参数给干掉。
14:07
啊,终于呢,把这个事儿就做好了,做好以后呢,呃,再在这个具体的实现这块呢,还得测一下是吧。嗯,那测一下我们这样吧,我再去新建一个点。诶接来,然后呢,再把刚才这个我们CTRLC给它粘过来啊,这个又给我生成了一个这样的文件啊,没有用啊,CTRLV粘过来,诶粘过来的时候呢,这时候我们看一下这个导入的,导入的这个里边我们导入就是这个三里的了啊这个这个还是二的啊,诶这个呢是我们三里边,就刚才咱们自己重新用定义的这个,诶customer deal的。行,嗯,这个里边呢,我们主要来看的是你这个查询的操作。那查询操作这个do去get它点进来,这不这里边我们就没有传那个customer.class了,下边这个呢,也没有传。
15:04
还没有传好,那回过去咱们跑一下这两个方法,看看这个O不OK啊,直行。没问题,下边。执行啊没问题,行,那我们刚才这个修改呢,就是成功的,哎,就是为了给这个哎这块呢,加上一个泛型,哎,然后呢,给我们这个具体的这个时间类子类里边这块呢,也是提供下一个翻型,那这就可以了啊。行,那么在我们这个负类里边呢,最后像这个呢,就是一个正常的一个泛型方法了,人家这个叫E啊,咱们上面用的叫T啊,这样行,那大家呢,你练的话呢,你就练,那你练这个第二套也行,练第三套也行啊,你要第三套觉得有难度,那你就还传一个那个卡class也行啊。
我来说两句