纠纷奇闻作文社交美文家庭
家庭城市
爱好生活
创业男女
能力餐饮
美文职业
心理周易
母婴奇趣
两性技能
社交传统
新闻范文
工作个人
思考社会
作文职场
家居中考
兴趣安全
解密魅力
奇闻笑话
写作笔记
阅读企业
饮食时事
纠纷案例
初中历史
说说童话
乐趣治疗

看完后让你成为武松,手把手教你打死Java中的纸老虎

3月11日 夜未央投稿
  泛型,其实算是Java当中比较难的语法了,很多人一开始都对其一知半解,也很害怕阅读带泛型的源码,虽然看起来语法很难,但当你理解后会觉得很简单,其实只是一个纸老虎罢了。下面,我将会用非常简单易懂的方式带你去理解它,相信你在认真看完后会有非常大的收获,从此不会再畏惧它!
  一。泛型的定义
  这里大家可以不必去看网上的有些定义,因为相对于比较学术化,只需记住泛型可以在程序设计中指定某种类型,让程序的设计更加规范化即可二。为什么要用到泛型
  了解到了泛型是什么后,那我们来讨论讨论为什么要用泛型这个语法,这个语法到底是干什么的?别急,下面,我先给大家举一个例子:classStack{publicObject〔〕publicStack(){this。objectsnewObject〔10〕;}publicvoidpush(Objectobj){objects〔this。top〕}publicObjectget(){returnobjects〔this。top1〕;}}
  大家可以看看这是在干什么呢?这是我们自己写了一个栈,然后将栈里的数组类型设置成Object类型,这样的话这个栈里任意类型的数据都可以存放了(Object类是任何类的父类,不管插入什么类型的数据,都可以发生向上转型)
  下面,我们来测试一下publicclassTest{publicstaticvoidmain(String〔〕args){StackstacknewStack();stack。push(1);stack。push(2);stack。push(123);Stringstr(String)stack。get();}}
  可以看到,我们可以向自己写的栈里放入整形以及字符串等等任何类型的数据,但注意一下取出数据的时候要进行强制类型转换
  以上这样写,可以向栈里存放任何类型的数据,比较通用,其优点也可以变成缺点,正因为太通用了,使代码的规范性降低,看起来比较凌乱,这时候,我们可以考虑使用泛型,这样可以在类中或者Java集合中存放特定的数据(使用Java集合时,一般都要用到泛型,而自定义的类型中可以使用泛型也可以不使用)三。泛型的写法
  以自定义的类型为例,写法为在类名后面加上尖括号,里面写上一个字母(注意,此处写任何字母都可以,只起到一个标记这个类为泛型类的作用)classStackT
  而在new对象时,以栈里只能存放整形为例,前面的尖括号必须写基本数据类型对应的包装类,而后面的尖括号可以不用写,示例如下:StackIntegerstacknewStack();
  补一下Java中的基本数据类型与对应的包装类:
  因此,我们前面写的自定义的栈可以写成以下形式(以存放整形为例):classStackT{publicT〔〕publicStack(){this。objects(T〔〕)newObject〔10〕;}publicvoidpush(Tobj){objects〔this。top〕}publicTget(){returnobjects〔this。top1〕;}}StackIntegerstacknewStack();stack。push(1);stack。push(2);intretstack。get();System。out。println(ret);
  特别注意此处:publicStack(){this。objects(T〔〕)newObject〔10〕;}
  这里不能写成this。objectsnewT〔10〕;原因:1。不能new泛型类型的数组2。也可理解为泛型是先检查后编译的,如果new泛型类型的数组的话,编译器检查时并不知道T是什么类型的,因此会报错。而编译的时候才会进行擦除机制,都会将其转换为Object类型3。正因为有这个擦除机制,这里才能进行数组整体强制类型转换(一般数组不能整体进行强制类型转换),因为泛型只是在编译的时候起作用,而实际运行时都会被擦除成Object类型,即实际运行时是没有泛型这个概念的,也即实际运行时类型都是一样的,所以T本质上是object类型的,所以此代码等价于不进行强制类型转换!!!4。而直接指定泛型的代码(不是T)比如:Stack和Stack都是在运行时直接把尖括号里的类型擦掉了,可以看到直接打印的结果(并没有打印出类型):liul
  此处注意多理解理解
  四。泛型的使用实例1。求最大值
  以上就是泛型的一个重要知识点了,但光看是不够的,还是得通过例子让大家有一个更为深入的理解,比如,如何写一个泛型类来求数组的最大值呢?
  基本的框架大概是这样的:(没看懂的小可爱好好看看上面讲的内容哦)classAlgorithmTextendsComparableT{publicTfindMax(T〔〕array){Tmaxarray〔0〕;for(inti1;iarray。i){if(maxarray〔i〕){maxarray〔i〕;}}}}
  但是此代码if(maxarray〔i〕)会报错,为什么呢?因为将来给T传的值一定是一个引用类型,引用类型不能直接比较大于或者小于的,是要用Comparable或Comparator接口里的方法比较的,因为泛型在编译的时候会被擦除成Object类型,但Object类本身并没有实现Comparable或Comparator接口,所以我们要控制其不要擦除到Object类,所以要给泛型指定一个边界
  具体写法如下:classAlgorithmTextendsComparableT{publicTfindMax(T〔〕array){Tmaxarray〔0〕;for(inti1;iarray。i){maxarray〔i〕if(max。compareTo(array〔i〕)0){maxarray〔i〕;}}}}classAlgorithmTextendsComparableT
  注意,extends叫做上界,此代码代表的意思为T这个泛型类会擦除到实现了Comparable接口的地方,换句话说,这个T类型一定是实现了Comparable接口的
  同理:这个代码publicclassMyArrayList{。。。}代表E为Number的子类或Number本身
  下面让我们来用一下:AlgorithmIntegeralgorithm1newAlgorithm();Integer〔〕integers{1,2,13,4,5};Integerretalgorithm1。findMax(integers);System。out。println(ret);
  运行结果如下:
  成功了!
  2。优化
  经过上面的努力,我们已经写出了一个泛型类来求一个数组的最大值了,但是,上面的例子是一个整形数组,那么我们能不能在数组里存放别的类型去比较呢?答案是可以的,但是我们还得去new一个对象,例如:Algorithmalgorithm2newAlgorithm();这样很麻烦。但是我们可以将求最大值的方法设置成静态的classAlgorithm2,因为是静态的方法,不需要new对象,所以就没有在new对象时指定泛型的过程了,所以没必要给方法后加尖括号,但是去掉之后,代码又会被错:
  我们可以这样修改:classAlgorithm2{publicstaticTextendsComparableTTfindMax(T〔〕array){Tmaxarray〔0〕;for(inti1;iarray。i){if(max。compareTo(array〔i〕)0){maxarray〔i〕;}}}}
  此方法publicstaticTfindMax(T〔〕array){}叫做泛型方法
  下面继续带大家来用一下:publicstaticvoidmain(String〔〕args){Integer〔〕integers{1,2,13,4,5};会根据形参的类型推导出整个泛型的类型参数IntegerretAlgorithm2。findMax(integers);System。out。println(ret);Integerret2Algorithm2。IntegerfindMax(integers);System。out。println(ret2);}
  注意,ret1写法和ret2写法是一样的,都可以
  打印结果如下:
  五。通配符1。基本写法
  通配符也是泛型的一种,下面我们来写一个泛型方法来打印集合中的元素classTest{publicstaticTvoidprint(ArrayListTlist){for(Tt:list){System。out。println(t);}}
  这个写法很简单,上文都讲过了,那么让我们来试着用一下吧:publicstaticvoidmain(String〔〕args){ArrayListIntegerlistnewArrayList();list。add(1);list。add(2);list。add(3);Test。print(list);}
  打印的结果如下:
  除了以上这种写法,我们还可以将其改成通配符的写法,先给大家上代码:?代表通配符擦除机制Objectpublicstaticvoidprint2(ArrayL?list){for(Objectt:list){System。out。println(t);}}}
  此处for(Objectt:list)必须这样写,因为通配符也是有擦除机制的,会在编译器编程Object类型。2。上界语法:?extends上界示例:publicstaticvoidprintAll(MyArrayL?extendsNumberlist){。。。}xxxxxxxxxxbrpublicstaticvoidprintAll(MyArrayL?extendsNumberlist){br。。。br}
  代表可以传入类型实参是Number子类的任意类型的MyArrayList所以以下调用都是正确的:printAll(newMyArrayListInteger());printAll(newMyArrayListDouble());printAll(newMyArrayListNumber());xxxxxxxxxxbrprintAll(newMyArrayListInteger());brprintAll(newMyArrayListDouble());brprintAll(newMyArrayListNumber());
  以下调用都是错误的:printAll(newMyArrayListString());printAll(newMyArrayListObject());xxxxxxxxxxbrprintAll(newMyArrayListString());brprintAll(newMyArrayListObject());3。下界
  下界和上界的用法很类似语法:?super下界示例:publicstaticvoidprintAll(MyArrayL?superIntegerlist){。。。}xxxxxxxxxxbrpublicstaticvoidprintAll(MyArrayL?superIntegerlist){br。。。br}
  代表可以传入类型实参是Integer父类的任意类型的MyArrayList所以以下调用是正确的:printAll(newMyArrayListInteger());printAll(newMyArrayListNumber());printAll(newMyArrayListObject());xxxxxxxxxxbrprintAll(newMyArrayListInteger());brprintAll(newMyArrayListNumber());brprintAll(newMyArrayListObject());
  以下调用是错误的:printAll(newMyArrayListString());printAll(newMyArrayListDouble());xxxxxxxxxxbrprintAll(newMyArrayListString());brprintAll(newMyArrayListDouble());六。泛型的限制学习完后,我们应该注意泛型使用过程中以下一些限制:泛型类型参数不支持基本数据类型无法实例化泛型类型的对象无法使用泛型类型声明静态的属性无法使用instanceof判断带类型参数的泛型类型(因为被擦除机制擦除了)无法创建泛型类数组无法create、catch、throw一个泛型类异常(异常不支持泛型)泛型类型不是形参一部分,无法重载
  好啦,本次泛型知识点的分享就先告一段落了,整理不易,但如果能帮到大家很开心了。也希望大家多理解理解,不论是刚开始学习还是复习,都值得仔细揣摩哦!一起加油吧!
投诉 评论 转载

争议中的宋湘波,从知名记者到街头流浪汉,他经历了什么近日,宋湘波这个名字引起了不少网友的关注,他本是名校毕业的高材生,满腹才华的媒体人,前途一片光明,但却甘愿沦落为街头的流浪汉。这些年,他都经历了什么?推动他当流浪汉的根本……发烧友十段位,你在几段?阜新声艺视听发烧友的心路历程:对大多数发烧友玩音响来说,都会经历这些不同阶段,酸甜苦辣,滋味自知;每个烧友家庭搭建的音响系统,俗称罐头音乐,玩的就是折腾,享受的是过程,盲人摸象,真的是可以……比亚迪宣布首次中标爱尔兰纯电动巴士订单,共200台IT之家7月20日消息从比亚迪获悉,当地时间7月19日,比亚迪在英国本地的巴士制造商合作伙伴亚历山大丹尼斯(ADL)与爱尔兰国家交通管理局(NTA)签署战略合作框架协议。……比亚迪2021款唐DM强制保电功能OTA升级IT之家7月10日消息昨日,比亚迪宣布2021款唐DM强制保电功能OTA升级。比亚迪表示,2021款唐DM将陆续推出强制保电功能OTA免费升级服务,新增智能保电与强制保电……强强联合合肥比亚迪有关合作项目将于8月底开工建设感谢IT之家网友我就看看嗷的线索投递!IT之家7月9日消息据合肥发布,安徽省委常委、合肥市委书记虞爱华今日下午与比亚迪公司董事长兼总裁王传福商谈推动全面战略合作。双……5G手机品鉴,华为畅享20Plus全频5G值得入手5G手机普及大潮已经到来,4G手机正在慢慢退出历史舞台。对于当下的年轻人来说,换机升级时5G经成为必选项,而选择什么样的5G手机,或许是一件令人纠结的事,看着各种高大上的参数,……特斯拉全自动驾驶FSDBeta9。0解读UI大改更美观,毫米就在昨天,特斯拉更新了公测用户期待已久的FSDBeta9。0。这一版本的FSD更新不断跳票,被催更数月后才获得更新。目前,美国的特斯拉测试用户已经可以下载FSDBeta9……西门子与各方携手共探科技价值全面深化数字化转型西门子(中国)有限公司执行副总裁、西门子大中华区数字化工业集团总经理王海滨。资料图数字化正以其看得见、摸得着的切实价值和巨大成就成为助推中国数字经济持续快速增长的重要引擎……2020翼联EDUP团队复制分享会暨拜师仪式盛大举办12月4日下午,一场别开生面的活动在翼联EDUP青春舞台盛大举办。翼联所有小伙伴相聚在一起,一同分享这振奋人心又欢欣鼓舞的时刻。外贸部黎景思林富英、亚马逊部何丹丹、……华为智慧屏X65与华为P40的智慧碰撞逃也逃不掉的真香定律2020年4月8日晚,华为再次将智慧屏这个产品推向了千万消费者的视野中。这个由华为倾注全球顶级研发资源打造、华为智慧屏领域的顶级旗舰华为智慧屏X65承载着华为对未来智慧大屏构想……看完后让你成为武松,手把手教你打死Java中的纸老虎泛型,其实算是Java当中比较难的语法了,很多人一开始都对其一知半解,也很害怕阅读带泛型的源码,虽然看起来语法很难,但当你理解后会觉得很简单,其实只是一个纸老虎罢了。下面,我将……2021年美国混合动力汽车销量创历史新高,丰田本田位列前二1月7日消息,据路透社1月6日报道,当纯电动汽车正在成为所有头条新闻时,混合动力汽车去年在美国悄然实现了创纪录的销量。在特斯拉和福特汽车等公司推动电动汽车销售同时,亚洲汽……
150元16G洋垃圾颗粒重置AMD专用内存条细密曝光,花样多华为Mate40跟华为p50哪个好?华硕无畏15OLED笔记本好屏无畏华硕先行为什么用过了苹果之后很难选择其他品牌的手机了?手机电量剩一半就充比较好,还是快没电了再充比较好?为啥?年过三十五,面临中年失业,除了干快递和开滴滴,还有别的出路吗家里装的100兆电信光纤,用哪个牌子的路由器比较好呢?LASoundDEVIANK音响线材让电流如同法拉利般畅快淋装饰材料行业怎么找客户,进而提高销售量,这几个方法不能错过性能旗舰iQOO7游戏实测王者满帧无压力,全感操控更沉浸CDALevelI数据分析认证考试模拟题库(一)在开年爆款的荣耀大天使身上,我们看到了ARPG的新思考
幸福的个瞬间看了心里甜甜的神奇的植物狗咬人不承认赔偿怎么处理这一生,活成自己喜欢的模样探险队发现成吉思汗墓线索双十一为什么买手机不要选128G?跟着内行人走,不会踩坑孕妈咪前置胎盘注意事项有哪些普拉达是哪个国家的品牌时尚女人必备人最大的压力来自哪里?压力最大的十大职业是粉尘吗培养宝宝时间观念三步走小学生春游作文600字集合6篇

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找美丽时装彩妆资讯历史明星乐活安卓数码常识驾车健康苹果问答网络发型电视车载室内电影游戏科学音乐整形