java概述课件21泛型.ppt
1,第21章 泛型(generic),干寡他涧竹崎鄙缕田措讯燃蛹牢包酝哨根歧苛材氓酸蜀绚赞琳狱轩惹起昌java概述课件 21 泛型java概述课件 21 泛型,2,学习目标,泛型的优点使用泛型类和接口定义泛型类和接口泛型:提高可靠性和可读性泛型方法,受限泛型类型 使用原始类型向后兼容泛型的通配泛型消除,泛型限制与局限泛型矩阵类的设计与实现,诈慈挂漾麻退妥却稍墅埠豹投帝谍洗夹蹿品冉耕丰惺苟角息藩赃玻恕看淹java概述课件 21 泛型java概述课件 21 泛型,3,编译时出现警告信息,public class ShowUncheckedWarning public static void main(String args)java.util.ArrayList list=new java.util.ArrayList();list.add(Java Programming);,要理解本行上的编译警告,需要学习JDK 1.5有关泛型的内容。,仔捣摸膳樟惟擦患昨讳搁按鞘庞期浴靛嘶件吐纹仇绢卿推拔斋旱镊胜莲丫java概述课件 21 泛型java概述课件 21 泛型,4,排除警告,public class ShowUncheckedWarning public static void main(String args)java.util.ArrayList list=new java.util.ArrayList();list.add(Java Programming);,本行不再有警告信息出现,羚至省住而侦吮溢扬席壬尝峦文笺赃崎磊腋叉馈件短爬馋汾坚烃戍硬冠怂java概述课件 21 泛型java概述课件 21 泛型,5,引言,泛型(generic)是指参数化类型的能力。具备这一能力之后,就可以定义带泛型类型的类或方法,随后编译器会用具体的类型来替换它。例如:定义一个泛型栈类,存储的是泛型元素。从该泛型类可生成一个包含字符串的栈对象,也可以生成一个包含数字的栈对象。此时,字符串和数字都是替换泛型的具体类型。,凹棍胃迂违唾川摇丈记募襟踩征倔碾津最港穷壁压斋迂丑闺己真彰铱见铬java概述课件 21 泛型java概述课件 21 泛型,6,为何要使用泛型?,使用泛型的主要主要优点是能够在编译时而不是在运行时检测出错误。泛型类或方法允许用户指定可以和这些类或方法一起工作的对象类型。如果试图使用一个不相容的对象,编译器就会检测出该错误。,批悍待峡椅旷哩争帕严摄忙辗震胃魔岿听演锚橱疹婴或瘤消翠侯碌捡柄瀑java概述课件 21 泛型java概述课件 21 泛型,7,泛型类型,泛型实例化时,运行时报错,编译时报错,提高了可靠性,志南菌歹义楞芜鄂支礼略锗缩能杰铂玖炎烹耐恤磁颊搽鼻札赔等撅刑镣贫java概述课件 21 泛型java概述课件 21 泛型,8,JDK 1.5前后的泛型类ArrayList,思饺胸刊迄弊略楷彦区台沁溉糕抓崩津獭篙炙辩镭收猪骡茹榆馁锑钙酷沸java概述课件 21 泛型java概述课件 21 泛型,9,有了泛型,不再需要转型(cast),ArrayList list=new ArrayList();list.add(5.5);/5.5自动转换为new Double(5.5)list.add(3.0);/3.0 自动转换为new Double(3.0)Double doubleObject=list.get(0);/不再需要转型double d=list.get(1);/自动转换为double,凿鹤衙圆维渣漱斑屡够量菱精荚林擦器锁寂专仙珠陀珍试帧刘池徽镐猜尾java概述课件 21 泛型java概述课件 21 泛型,10,定义泛型类和接口,GenericStack,苍挎绩睛蜡摸距诸敦吁颧脏雪淑饭吧岁瘫荡雷肤腔括冠桥仆民讫射拥临赢java概述课件 21 泛型java概述课件 21 泛型,11,泛型方法,public static void print(E list)for(int i=0;i list.length;i+)System.out.print(listi+);System.out.println();,public static void print(Object list)for(int i=0;i list.length;i+)System.out.print(listi+);System.out.println();,掸钾蛛他肪体蜜鸿谣峨淘诸稿湃疾底笆读屋伸素话讹蘑颅脚俩磷聪痉汉绳java概述课件 21 泛型java概述课件 21 泛型,12,受限的泛型类,public static void main(String args)Rectangle rectangle=new Rectangle(2,2);Circle9 circle=new Circle9(2);System.out.println(Same area?+equalArea(rectangle,circle);public static boolean equalArea(E object1,E object2)return object1.getArea()=object2.getArea();,冬蹋螟岸柯倡弘逝秆植谚钓爸购呵派占驻次乓惮专翱伎妖板继肚组宾体铸java概述课件 21 泛型java概述课件 21 泛型,13,原始类型和向后兼容,/原始类型ArrayList list=new ArrayList();,这相当于ArrayList list=new ArrayList();,羞洱宪诲浊插夕脏乎良宽次地步萝衅二豪独懦碳悟郎慎勇呻贿渠裴殉讫涣java概述课件 21 泛型java概述课件 21 泛型,14,原始类型:不安全,Max.max(Welcome,23);,/Max.java:Find a maximum objectpublic class Max/*Return the maximum between two objects*/public static Comparable max(Comparable o1,Comparable o2)if(pareTo(o2)0)return o1;else return o2;,运行时错误,冗脐现镍痉仟哺炽汁开祝聪炕咸美儒扒烘茵悼唁隶承占拳故潜矩僻啃膝沥java概述课件 21 泛型java概述课件 21 泛型,15,改为安全的,Max1.max(Welcome,23);,/Max1.java:Find a maximum objectpublic class Max1/*Return the maximum between two objects*/public static E max(E o1,E o2)if(pareTo(o2)0)return o1;else return o2;,闰侈卓勋拽汗铅吏拘伊巢碉边缝萝脐黄恋篮还画列元淄上岛藩帐谈瓤钉擅java概述课件 21 泛型java概述课件 21 泛型,16,泛型的通配,WildCardDemo1,使用通配符的必要性,?非受限通配符?extends T 上限通配符?super T 下限通配符,WildCardDemo2,WildCardDemo3,奈壮纱茅纲阐蛙扎肃饵没遣漫冒庶掣猫浊搓沂唉藏秉栓竭晌舆臃屿洼探炼java概述课件 21 泛型java概述课件 21 泛型,17,泛型类型和通配符类型,碾绵上氧秀稚浮滴磺瑶劫卷风啪倍豌娠哺芒溜宴吮淌濒使郊率增拎迈盅易java概述课件 21 泛型java概述课件 21 泛型,18,避免不安全的原始类型,用new ArrayList()来替代new ArrayList();,TestArrayListNew,Run,指忻蒸坠住蹲圆寸剔书邮共瞻许朴泳萤杆蛇珠骇纪豢锥其方舀桃佰灵膊褪java概述课件 21 泛型java概述课件 21 泛型,19,泛型的擦处和限制,泛型是通过泛型擦除机制来实现的编译器在编译代码时使用了泛型类型信息,但随即将该信息擦除。因此,在运行时泛型信息不再可用这种方法可以使泛型代码向后兼容使用原始类型的遗留代码,答孙宗触梭捻撮于纷癸阶领苦立共台襟臼莎棍犬叁启栏皖窍挣从眶辆釜邢java概述课件 21 泛型java概述课件 21 泛型,20,编译时的检查,例如,编译器会检查(a)中的代码是否正确使用了泛型,如果正确使用了泛型,就把它翻译成(b)一样的等价代码,以便在运行时使用。(b)中代码使用的就是原始类型。,渡酶浪注娇钩痔剐撼磺谴凳项茬跳绦将协蜡押阎囤述气束并衅喳唬沦蓝计java概述课件 21 泛型java概述课件 21 泛型,21,注意,不管具体的实际类型是什么,泛型被它的所有实例所共享GenericStack stack1=new GenericStack();GenericStack stack2=new GenericStack();虽然 GenericStack 和 GenericStack 是两种类型,但在运行时只有一种 GenericStack 类被加载到JVM中,儒荫瑟倡劲疲币向韩酬鱼所格涯硕亿洪傍层辉样呻洋躁官郊笛啮摈申轰拉java概述课件 21 泛型java概述课件 21 泛型,22,对泛型的限制,限制1:不能使用泛型类型参数创建实例 i.e.,new E()限制2:不能使用泛型类型参数创建数组i.e.,new E100限制3:在静态环境下不允许类的参数是泛型类型限制4:异常类不能是泛型的,蝶位酿性性争馋蠢咋旦幼络邯原惭滑男沈窜浩想仑谱椰薪殉抢怪谩叭蔗媒java概述课件 21 泛型java概述课件 21 泛型,23,设计:泛型矩阵类,目标:使用泛型类型设计对矩阵进行操作的类,实现对所有类型的矩阵进行矩阵加和矩阵乘的操作,GenericMatrix,侯涝悍妇墟吉大粪龟艰拴挪骇粳蕊漏急芥督抑逞鲤隘论辛钒惧劝欢徊萤他java概述课件 21 泛型java概述课件 21 泛型,24,UML图,坏嚣攀涅早拾蒜东如还驶妥撇蛮班塔惺祈狙衬讯黑彩仑脖骗仙件么玖自辗java概述课件 21 泛型java概述课件 21 泛型,25,目标:利用GenericMatrix类,两个程序分别完成了整数和有理数的矩阵算术。,TestIntegerMatrix,Run,TestRationalMatrix,Run,RationalMatrix,IntegerMatrix,源码,策礁德为树辽鲍默舔语凑概嫡集电扛虎破车裸劳皿最帜烁涩酞迪蔓醋辟瞩java概述课件 21 泛型java概述课件 21 泛型,