简单理解泛型

泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。通俗点将就是“类型的变量”。这种类型变量可以用在类、接口和方法的创建中。
理解Java泛型最简单的方法是把它看成一种便捷语法,能节省你某些Java类型转换(casting)上的操作:
List<Apple> box = new ArrayList<Apple>(); box.add(new Apple());Apple apple =box.get(0);
上面的代码自身已表达的很清楚:box是一个装有Apple对象的List。get方法返回一个Apple对象实例,这个过程不需要进行类型转换。没有泛型,上面的代码需要写成这样:
Apple apple = (Apple)box.get(0);
泛型的尴尬
泛型的最大优点是提供了程序的类型安全同时可以向后兼容,但也有尴尬的地方,就是每次定义时都要写明泛型的类型,这样显示指定不仅感觉有些冗长,最主要是很多程序员不熟悉泛型,因此很多时候不能够给出正确的类型参数,现在通过编译器自动推断泛型的参数类型,能够减少这样的情况,并提高代码可读性。
java7的泛型类型推断改进
在以前的版本中使用泛型类型,需要在声明并赋值的时候,两侧都加上泛型类型。例如:
Map<String, String> myMap = new HashMap<String, String>();
你可能觉得:老子在声明变量的的时候已经指明了参数类型,为毛还要在初始化对象时再指定?幸好,在Java SE 7中,这种方式得以改进,现在你可以使用如下语句进行声明并赋值:
Map<String, String> myMap = new HashMap<>(); //注意后面的"<>"
在这条语句中,编译器会根据变量声明时的泛型类型自动推断出实例化HashMap时的泛型类型。再次提醒一定要注意new HashMap后面的“<>”,只有加上这个“<>”才表示是自动类型推断,否则就是非泛型类型的HashMap,并且在使用编译器编译源代码时会给出一个警告提示。
但是:Java SE 7在创建泛型实例时的类型推断是有限制的:只有构造器的参数化类型在上下文中被显著的声明了,才可以使用类型推断,否则不行。例如:下面的例子在java 7无法正确编译(但现在在java8里面可以编译,因为根据方法参数来自动推断泛型的类型):
List<String> list = new ArrayList<>();
list.add("A");// 由于addAll期望获得Collection<? extends String>类型的参数,因此下面的语句无法通过
list.addAll(new ArrayList<>());
Java8的泛型类型推断改进
java8里面泛型的目标类型推断主要2个:
1.支持通过方法上下文推断泛型目标类型
2.支持在方法调用链路当中,泛型类型推断传递到最后一个方法
让我们看看官网的例子
class List<E> {
static <Z> List<Z> nil() { ... };
static <Z> List<Z> cons(Z head, List<Z> tail) { ... };
E head() { ... }
}
根据JEP101的特性,我们在调用上面方法的时候可以这样写
//通过方法赋值的目标参数来自动推断泛型的类型 List<String> l = List.nil(); //而不是显示的指定类型 //List<String> l = List.<String>nil(); //通过前面方法参数类型推断泛型的类型 List.cons(42, List.nil()); //而不是显示的指定类型 //List.cons(42, List.<Integer>nil());
总结
以上是JEP101的特性内容了,Java作为静态语言的代表者,可以说类型系统相当丰富。导致类型间互相转换的问题困扰着每个java程序员,通过编译器自动推断类型的东西可以稍微缓解一下类型转换太复杂的问题。 虽然说是小进步,但对于我们天天写代码的程序员,肯定能带来巨大的作用,至少心情更愉悦了~~说不定在java 9里面,我们会得到一个通用的类型var,像js或者scala的一些动态语言那样^_^
# java8
# 新特征
# java8泛型推断
# Java8新特性之再见Permgen_动力节点Java学院整理
# Java8新特性之JavaFX 8_动力节点Java学院整理
# Java8新特性之lambda的作用_动力节点Java学院整理
# Java8新特性之lambda(动力节点Java学院整理)
# 详谈Java8新特性泛型的类型推导
# Java8新特性之重复注解(repeating annotations)浅析
# Java8新特性lambda表达式有什么用(用法实例)
# Java8新特性之Lambda表达式浅析
# JAVA8 十大新特性详解
# Java新特性之Nashorn_动力节点Java学院整理
# 而不是
# 是一个
# 也有
# 你可以
# 是有
# 都要
# 让我们
# 不需要
# 可以说
# 把它
# 要在
# 这条
# 才可以
# 很清楚
# 用在
# 最简单
# 不能够
# 不熟悉
# 官网
# 源代码
相关文章:
如何批量查询域名的建站时间记录?
非常酷的网站设计制作软件,酷培ai教育官方网站?
威客平台建站流程解析:高效搭建教程与设计优化方案
七夕网站制作视频,七夕大促活动怎么报名?
大型企业网站制作流程,做网站需要注册公司吗?
c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】
网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?
怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?
昆明高端网站制作公司,昆明公租房申请网上登录入口?
如何通过老薛主机一键快速建站?
Swift中swift中的switch 语句
专业网站建设制作报价,网页设计制作要考什么证?
nginx修改上传文件大小限制的方法
东莞专业制作网站的公司,东莞大学生网的网址是什么?
h5网站制作工具有哪些,h5页面制作工具有哪些?
测试制作网站有哪些,测试性取向的权威测试或者网站?
实惠建站价格推荐:2025年高性价比自助建站套餐解析
网站专业制作公司有哪些,做一个公司网站要多少钱?
如何在IIS中配置站点IP、端口及主机头?
哈尔滨网站建设策划,哈尔滨电工证查询网站?
如何快速完成中国万网建站详细流程?
实例解析Array和String方法
高防服务器如何保障网站安全无虞?
宝华建站服务条款解析:五站合一功能与SEO优化设置指南
制作网站的软件下载免费,今日头条开宝箱老是需要下载怎么回事?
建站主机类型有哪些?如何正确选型
GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?
建站之星微信建站一键生成小程序+多端营销系统
如何解决ASP生成WAP建站中文乱码问题?
建站之星后台管理:高效配置与模板优化提升用户体验
教程网站设计制作软件,怎么创建自己的一个网站?
如何在建站主机中优化服务器配置?
网站制作报价单模板图片,小松挖机官方网站报价?
,柠檬视频怎样兑换vip?
如何快速搭建二级域名独立网站?
网站制作免费,什么网站能看正片电影?
宁波免费建站如何选择可靠模板与平台?
如何在阿里云部署织梦网站?
在线制作视频的网站有哪些,电脑如何制作视频短片?
网站制作话术技巧,网站推广做的好怎么话术?
建站之星手机一键生成:多端自适应+小程序开发快速建站指南
网站制作壁纸教程视频,电脑壁纸网站?
c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
视频网站app制作软件,有什么好的视频聊天网站或者软件?
韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南
如何在云虚拟主机上快速搭建个人网站?
C#怎么使用委托和事件 C# delegate与event编程方法
昆明网站制作哪家好,昆明公租房申请网上登录入口?
清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?
*请认真填写需求信息,我们会在24小时内与您取得联系。