网站大量收购闲置独家精品文档,联系QQ:2885784924

J的ava 泛型.docx

  1. 1、本文档共24页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
J的ava 泛型

什么是泛型泛型是jdk5引入的类型机制,就是将类型参数化,它是早在1999年就制定的jsr14的实现。泛型机制将类型转换时的类型检查从运行时提前到了编译时,使用泛型编写的代码比杂乱的使用object并在需要时再强制类型转换的机制具有更好的可读性和安全性。泛型程序设计意味着程序可以被不同类型的对象重用,类似c++的模版。泛型对于集合类尤其有用,如ArrayList。这里可能有疑问,既然泛型为了适应不同的对象,ArrayList本来就可以操作不同类型的对象呀?那是因为没有泛型之前采用继承机制实现的,实际上它只维护了一个Object对象的数组。结果就是对List来说它只操作了一类对象Object,而在用户看来却可以保存不同的对象。泛型提供了更好的解决办法——类型参数,如:ListString list = new ArrayListString();这样解决了几个问题:1 可读性,从字面上就可以判断集合中的内容类型;2 类型检查,避免插入非法类型。3 获取数据时不在需要强制类型转换。泛型类publicclassPairT{private T field1;}其中?T?是类型参数定义。使用时:PairString p = new PairString();此时类内部的field1就是字符串类型了。如果引用多个类型,可以使用逗号分隔:S, D类型参数名可以使用任意字符串,建议使用有代表意义的单个字符,以便于和普通类型名区分,如:T代表type,有原数据和目的数据就用S,D,子元素类型用E等。当然,你也可以定义为XYZ,甚至xyZ。泛型方法泛型方法定义如下:publicstatic T T marshalle(T arg){}与泛型类一样,T?是类型参数定义。如:publicclassGenericMethod {publicstatic T T getMiddle(T... a){return a[a.length/2]; }}严格的调用方式:String o=GenericMethod.StringgetMiddle(213,result,12);一般情况下调用时可以省略,看起来就像定义String类型参数的方法:GenericMethod.getMiddle(String,String,String),这是因为jdk会根据参数类型进行推断。看一下下面的例子:Object o=GenericMethod.getMiddle(213,0,12);System.out.println(o.getClass());System.out.println(o);输出结果为:classjava.lang.Integer0这是因为jdk推断三个参数的共同父类,匹配为Object,那么相当于:Object o=GenericMethod.ObjectgetMiddle(213,0,12);习惯了类型参数放在类的后面,如ArrayListString,泛型方法为什么不放在后面?看一个例子:publicstatic T,S T f(T t){return t;}publicstaticclassa{}publicstaticclassb{}//尽量恶心一点@Testpublicvoidtest(){ a c=new a(); a,bf(c);//OK fa,b(c);//error,看起来像是一个逗号运算符连接的两个逻辑表达式,当然目前java中除了for(...)并不支持逗号运算符}因此,为了避免歧义,jdk采用类型限定符前置。泛型方法与泛型类的方法如果泛型方法定义在泛型类中,而且类型参数一样:publicclassGenericMethodT {public T voidsayHi(T t){ System.out.println(Hi +t); }}是不是说,定义GenericMethod时传了 Integer 类型,sayHi()也就自动变成 Integer 了呢?No。String i=abc;new GenericMethodInteger().StringsayHi(i);该代码运行一点问题都没有。原因就在于泛型方法中的T,如果去掉它,就有问题了。The method sayHi(Integer) in the typeGenericMethodInteger is not applicable for the arguments (String)小结:泛型方法有自己的类型参数,泛型类的成员方法使用的是当前类的类型参数。方法中有T?是泛型方法;没有的,称为泛型类中的成员方法。类型参数的限定如果限制只有特定某些类可以传入T参数,那么可以对T进行限定,如:只有实现了特定接口的类:T extends Compa

文档评论(0)

liwenhua00 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档