尚硅谷_宋红康_第8章_泛型_第1页
尚硅谷_宋红康_第8章_泛型_第2页
尚硅谷_宋红康_第8章_泛型_第3页
尚硅谷_宋红康_第8章_泛型_第4页
尚硅谷_宋红康_第8章_泛型_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第8章泛型,讲师:宋红康新浪微博:尚硅谷-宋红康,JavaSE知识图解,JAVA发展历程,JAVA环境搭建,基础程序设计,数据类型,流程控制,运算符,数组,面向对象编程,类和对象,属性,方法,设计模式,接口,三大特性,应用程序开发,JDBC,集合,异常处理,类库,多线程,IO,反射,网络,连接Oracle,JAVA新特性,Eclipse使用,泛型,枚举,装箱/拆箱,可变参数,Annotation,一、为什么要有泛型(Generic)?,1.解决元素存储的安全性问题2.解决获取数据元素时,需要类型强转的问题,在集合中没有泛型时,String类型对象,集合Object类型对象,Object类型对象,String类型对象,一、为什么要有泛型Generic?,泛型,JDK1.5新加入的,解决数据类型的安全性问题,其主要原理是在类声明时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。这样在类声明或实例化时只要指定好需要的具体的类型即可。Java泛型可以保证如果程序在编译时没有发出警告,运行时就不会产生ClassCastException异常。同时,代码更加简洁、健壮。,集合中使用泛型时,String类型对象,集合String类型对象,String类型对象,不需要强转,二、使用泛型,1.泛型的声明interfaceList和classTestGen其中,T,K,V不代表值,而是表示类型。这里使用任意字母都可以。常用T表示,是Type的缩写。2.泛型的实例化:一定要在类名后面指定类型参数的值(类型)。如:ListstrList=newArrayList();Iteratoriterator=customers.iterator();T只能是类,不能用基本数据类型填充。,三、泛型的几个重要使用,1.在集合中使用泛型2.自定义泛型类3.泛型方法4.泛型接口,3.1对于泛型类(含集合类),1.对象实例化时不指定泛型,默认为:Object。2.泛型不同的引用不能相互赋值。3.加入集合中的对象类型必须与指定的泛型类型一致。,3.1对于泛型类(含集合类),4.静态方法中不能使用类的泛型。5.如果泛型类是一个接口或抽象类,则不可创建泛型类的对象。6.不能在catch中使用泛型7.从泛型类派生子类,泛型类型需具体化,把一个集合中的内容限制为一个特定的数据类型,这就是generics背后的核心思想。,classPerson/使用T类型定义变量privateTinfo;/使用T类型定义一般方法publicTgetInfo()returninfo;publicvoidsetInfo(Tinfo)=info;,/使用T类型定义构造器publicPerson()publicPerson(Tinfo)=info;/static的方法中不能声明泛型/publicstaticvoidshow(Tt)/不能在try-catch中使用泛型定义/try/catch(Tt),3.2自定义泛型类,3.3对于泛型方法,方法,也可以被泛型化,不管此时定义在其中的类是不是泛型化的。在泛型方法中可以定义泛型参数,此时,参数的类型就是传入数据的类型。泛型方法的格式:访问权限返回类型方法名(泛型标识参数名称)抛出的异常publicclassDAOpublicEget(intid,Ee)Eresult=null;returnresult;,staticvoidfromArrayToCollection(Ta,Collectionc)for(To:a)c.add(o);publicstaticvoidmain(Stringargs)Objectao=newObject100;Collectionco=newArrayList();fromArrayToCollection(ao,co);Stringsa=newString20;Collectioncs=newArrayList();fromArrayToCollection(sa,cs);Collectioncd=newArrayList();/下面代码中T是Double类,但sa是String类型,编译错误。/fromArrayToCollection(sa,cd);/下面代码中T是Object类型,sa是String类型,可以赋值成功。fromArrayToCollection(sa,co);,请输出如下来两段代码有何不同,voidprintCollection(Collectionc)Iteratori=c.iterator();for(intk=0;kc.size();k+)System.out.println(i.next();,voidprintCollection(Collectionc)for(Objecte:c)System.out.println(e);,3.4泛型和继承的关系,3.4泛型和继承的关系,如果B是A的一个子类型(子类或者子接口),而G是具有泛型声明的类或接口,G并不是G的子类型!比如:String是Object的子类,但是List并不是List的子类。,A,B,G,G,publicvoidtestGenericAndSubClass()Personpersons=null;Manmans=null;/而Person是Man的父类.persons=mans;Personp=mans0;/在泛型的集合上ListpersonList=null;ListmanList=null;/personList=manList;(报错),3.5通配符,1.使用类型通配符:?比如:List,MapList是List、List等各种泛型List的父类。2.读取List的对象list中的元素时,永远是安全的,因为不管list的真实类型是什么,它包含的都是Object。3.写入list中的元素时,不行。因为我们不知道c的元素类型,我们不能向其中添加对象。唯一的例外是null,它是所有类型的成员。,将任意元素加入到其中不是类型安全的:Collectionc=newArrayList();c.add(newObject();/编译时错误因为我们不知道c的元素类型,我们不能向其中添加对象。add方法有类型参数E作为集合的元素类型。我们传给add的任何参数都必须是一个未知类型的子类。因为我们不知道那是什么类型,所以我们无法传任何东西进去。唯一的例外的是null,它是所有类型的成员。另一方面,我们可以调用get()方法并使用其返回值。返回值是一个未知的类型,但是我们知道,它总是一个Object,publicstaticvoidmain(Stringargs)Listlist=null;list=newArrayList();list=newArrayList();/list.add(3);list.add(null);Listl1=newArrayList();Listl2=newArrayList();l1.add(“尚硅谷);l2.add(15);read(l1);read(l2);staticvoidread(Listlist)for(Objecto:list)System.out.println(o);,3.5.1有限制的通配符,允许所有泛型的引用调用举例:(无穷小,Number只允许泛型为Number及Number子类的引用调用Number,无穷大)只允许泛型为Number及Number父类的引用调用只允许泛型为实现Comparable接口的实现类的引用调用,3.5.1有限制的通配符,publicstaticvoidprintCollection3(Collectioncoll)/Iterator只能用Iterator或Iterator.why?Iteratoriterator=coll.iterator();while(iterator.hasNext()System.out.println(iterator.next();publicstaticvoidprintCollection4(Collectioncoll)Iteratoriterator=coll.iterator();while(iterato

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论