Java SE7新特性之泛型实例创建时的类型推断

标签: JDK7泛型
2014-01-04 15:34 6015人阅读 评论(0) 收藏 举报
 分类:
Java基础(9) 

只要编译器从上下文中能够推断出类型参数,你就可以使用一个空的类型参数集合 (<>)代替调用一个泛型类的构造器所需要的类型参数。 这对尖括号通常叫做 diamond.

举个例子, 考虑下面的变量声明:

Map<String, List<String>> myMap = new HashMap<String, List<String>>();

在Java SE 7中, 你可以使用一个空的类型参数集合 (<>)代替构造器的参数化类型:

Map<String, List<String>> myMap = new HashMap<>();

注意:想要在泛型类初始化期间利用自动类型推断,你必须要指定 diamond。下面的例子中,由于 HashMap() 构造器引用的是 HashMap 原始类型而不是 Map<String, List<String>> 类型,编译器会产生一个未检查的转换警告:

Map<String, List<String>> myMap = new HashMap(); // unchecked conversion warning

Java SE 7对于实例创建的类型推断的支持是有限的; 从上下文来看,只有构造器的参数化类型是明显的才能使用类型推断。 例如, 下面的例子编译不通过:

List<String> list = new ArrayList<>();
list.add("A");// The following statement should fail since addAll expects// Collection<? extends String>list.addAll(new ArrayList<>());

注意: diamond通常在方法调用中起作用;然而, 在变量声明时建议首要使用diamond。

相比之下, 下面的例子可以编译通过:

// The following statements compile:List<? extends String> list2 = new ArrayList<>();
list.addAll(list2);

类型推断以及泛型类和非泛型类的构造器

注意: 在泛型类和非泛型类中,构造器都可以是泛型的 (换句话说, 声明它们自己的形式参数):

class MyClass<X> {<T> MyClass(T t) {// ...}
}

考虑以下 MyClass类的初始化,在Java SE 7以及之前的版本中都有效:

new MyClass<Integer>("")

这个语句创建一个参数化类型 MyClass<Integer>的一个实例; 它显式的为泛型类 MyClass<X>指定 Integer 类型作为形式参数X 。 注意, 这个泛型类的构造器包含一个 形式参数。编译器推断这个泛型类的构造器的形式参数T的类型为 String  (因为这个构造器的实际参数是一个 String 对象)。

在Java SE 7之前,和泛型方法一样,编译器能够推断泛型构造器的实际参数。然而在 Java SE 7中,如果你使用diamond (<>),编译器能够推断被实例化的泛型类的实际参数 。考虑下面的例子,在Java SE 7以及之后的版本中都有效:

MyClass<Integer> myObject = new MyClass<>("");

在这个例子中,编译器推断泛型类 MyClass<X> 的形式参数 X的类型为 Integer 。 并且推断这个泛型类的构造器的形式参数T的类型为 String .

本文翻译自Oracle官方文档http://docs.oracle.com/javase/7/docs/technotes/guides/language/type-inference-generic-instance-creation.html,如有不正确的地方,敬请指正,谢谢!

Java SE7新特性之泛型实例创建时的类型推断相关推荐

  1. Java SE7新特性之try-with-resources语句

     try-with-resources语句是一个声明一个或多个资源的 try 语句.一个资源作为一个对象,必须在程序结束之后随之关闭. try-with-resources语句确保在语句的最后每个资源 ...

  2. java se7 新特性_Java SE7新特性之try-with-resources语句

    try-with-resources语句是一个声明一个或多个资源的 try 语句.一个资源作为一个对象,必须在程序结束之后随之关闭. try-with-resources语句确保在语句的最后每个资源都 ...

  3. Java SE7新特性之switch语句中使用字符串

    2019独角兽企业重金招聘Python工程师标准>>> 在JDK 7发布版本中, 可以在switch语句的表达式中使用String对象: public String getTypeO ...

  4. Java 8 新特性——实践篇

    Lambda 表达式 Lambda 表达式引入之前: 举个场景例子:当我们要对一个班级里的学生对象里各种成绩进行过滤时,比如大于85分获得A的学生集合,最初的方式是写不同的方法处理不同的科目成绩过滤: ...

  5. Java 8新特性探究(6):泛型的目标类型推断

    简单理解泛型 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.通俗点将就是"类型的变量".这种类型变量可以用在类.接口和方法 ...

  6. Java 8 新特性:扩展注解(类型注解和重复注解)

    转载自  Java 8 新特性:扩展注解(类型注解和重复注解) (注:先回顾下JDK1.5版本出现的注解 ,然后再解释JDK 8的注解 更新内容.) 一.注解(JDK1.5) 1.注解(@): 注解就 ...

  7. 跟我学 Java 8 新特性之 Stream 流基础体验

    转载自   跟我学 Java 8 新特性之 Stream 流基础体验 Java8新增的功能中,要数lambda表达式和流API最为重要了.这篇文章主要介绍流API的基础,也是流API系列的第一篇文章, ...

  8. 跟我学 Java 8 新特性之 Stream 流(二)关键知识点

    转载自   跟我学 Java 8 新特性之 Stream 流(二)关键知识点 我们的第一篇文章,主要是通过一个Demo,让大家体验了一下使用流API的那种酣畅淋漓的感觉.如果你没有实践,我还是再次呼吁 ...

  9. 跟我学 Java 8 新特性之 Stream 流(五)映射

    转载自   跟我学 Java 8 新特性之 Stream 流(五)映射 经过了前面四篇文章的学习,相信大家对Stream流已经是相当的熟悉了,同时也掌握了一些高级功能了,如果你之前有阅读过集合框架的基 ...

最新文章

  1. 零基础入门学习Python(10)-列表(2)
  2. [Codeforces1137D]Cooperative Game
  3. Tomcat 教程之快速入门
  4. JAVA通过反射获取方法真实参数名
  5. python封装c++接口_使用MetaSIP自动生成SIP封装C++到Python接口
  6. [bbk4343]小布-OCP 042全真试题讲解
  7. 【图数据库】Neo4j
  8. jquery.validate
  9. 语音识别人工智能解决方案
  10. 20145303刘俊谦 Exp7 网络欺诈技术防范
  11. 恩智浦智能车赛。摄像头处理函数。
  12. mysql 免安装 密码_mysql免安装版配置与修改密码
  13. 服装网站建设策划书-服装网站建设目的需求分析策划书
  14. 浏览器与HTTP网络协议缓存原理分析 转自网界网:http://news.cnw.com.cn/news-china/htm2015/20151027_322909.shtml
  15. servlet+js实现首页、尾页、下一页、上一页(翻页功能)
  16. Android读取M1卡数据
  17. 三星手机 qq上通过我的设备我的android上传到手机的东西,两个手机怎么互传文件?...
  18. Confluence 6 新 Confluence 安装配置一个数据源连接
  19. Linux目录与管理
  20. 最新美团面试集合(一面+二面+三面+重点技术面试题)附面试解析

热门文章

  1. 《Linux运维总结:服务器重启后无法识别挂载硬盘》
  2. ExcelVBA 之Select Case
  3. 使用fla格式作为美术资源管理的利弊
  4. 前后端分离项目线上部署
  5. python例程:AI智能联系人管理的程序
  6. radan7破解版|radan7中文破解版|2018最新版
  7. android面板不自动隐藏,【图片】折腾了几天 没办法完美隐藏。最后只能选择沉浸了打开软件导航栏自动消失桌面还是会一直出现的【三星s8吧】_百度贴吧...
  8. 图解windows 2000系统安装步骤
  9. 数字式声纳设计原理 pdf_低频数字式相位测试仪的原理与使用
  10. swift27个开元第三方库