欢迎来到天天文库
浏览记录
ID:22583166
大小:288.00 KB
页数:21页
时间:2018-10-30
《java泛型总结》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Java泛型总结1.什么是泛型?泛型(Generictype或者generics)是对Java语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法的形式参数是运行时传递的位的占位符一样。可以在集合框架(Collectionframework)屮看到泛彻的动机。例如,Map类允许您向一个Map添加任意类的对象,即使最常见的情况是在给定映射(map)中保存某个特定类型(比如String)的对象。因为Map.getO被定义为返回Objec
2、t,所以一般必须将Map.get()的结果强制类型转换为期望的类型,如下面的代码所示:Mapm=newHashMapO;m.putf'key’’,"blarg");Strings=(String)m.get(’’key’’);要让程序通过编译,必须将get()的结果强制类型转换为String,并且希望结果真的是一个Stringo但是有可能某人己经在该映射屮保存了不是String的东西,这样的话,上而的代码将会抛出ClassCastException。理想情况下,您可能会得出这样一个观点,即m是一个Map,
3、它将String键映射到String值。这可以让您消除代码屮的强制类型转换,同时获得一个附加的类型检查层,该检查层可以防止有人将错误类型的键或值保存在集合中。这就是泛型所做的工作。2.泛型的好处Java语言中引入泛型是一个较大的功能增强。不仅语言、类型系统和编译器有了较大的变化,以支持泛型,而It类库也进行了大翻修,所以许多重要的类,比如集合框架,都已经成为泛型化的了。这带來了很多好处:类型安全。泛型的主要目标是提高Java程序的类型安全。通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度
4、上验证类型假设。没有泛型,这些假设就只存在于程序员的头脑中(或者如果幸运的话,还存在于代码注释中)。Java程序中的一种流行技术是定义这样的集合,即它的元素或键是公共类型的,比如“String列表”或者“String到String的映射”。通过在变量声明巾捕获这一附加的类型信息,泛型允许编译器实施这些附加的类型约束。类型错误现在就可以在编译时被捕获了,而不是在运行时当作ClassCastException展示出来。将类型检査从运行时挪到编译时有助于您更容易找到错误,并可提高程序的可靠性。消除强制类型转换。
5、泛型的一个附带好处是,消除源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错机会。尽管减少强制类型转换可以降低使用泛型类的代码的罗嗦程度,但是声明泛型变量会带来相应的罗嗦。比较下而两个代码例子。该代码不使用泛型:Listli=newArrayList();li.put(newInteger(3));Integeri=(Integer)li.get(O);该代码使用泛型:Listli=newArrayLi$t();li.put(newInteger(3));I
6、ntegeri=li.get(O);在简中.的程序屮使用一次泛型变量不会降低罗嗦程度。但是对于多次使用泛型变呈的人型程序来说,则可以累积起来降低罗嗦程度。潜在的性能收益。泛型为较大的优化带来可能。在泛型的初始实现中,编译器将强制类型转换(没有泛型的话,程序员会指定这些强制类型转换)插入生成的字节码中。但是更多类型信息可用于编译器这一事实,为未來版本的JVM的优化带來可能。巾于泛型的实现方式,支持泛型(几乎)不需要JVM或类文件更改。所有工作都在编译器屮完成,编译器生成类似于没有泛型(和强制类型转换)时所写
7、的代码,只是更能确保类型安全而已。1.泛型用法的例子泛型的许多最佳例子都来自集合框架,因为泛型让您在保存在集合中的元素上指定类型约束。考虑这个使用Map类的例子,•其屮涉及一定程度的优化,即Map.getO返回的结果将确实是一个String:Mapm=newHashMapO;m.put("key","blarg");Strings=(String)m.get(Mkey");如果有人己经在映射屮放置了不是String的其他东西,上面的代码将会抛出ClassCastException。泛型允许您表达这样的类型
8、约束,即m是一个将String键映射到String值的Map。这可以消除代码中的强制类型转换,同吋获得一个附加的类型检查层,这个检查层可以防止有人将错误类型的键或值保存在集合屮。卜‘面的代码示例展示了JDK5.0中集合框架中的Map接口的定义的一部分:publicinterfaceMap{publicvoidput(Kkey,Vvalue);publicVget(Kkey);}注意该接口的两个附加物:类型参数K和V在
此文档下载收益归作者所有