`
jackiehff
  • 浏览: 6076 次
社区版块
存档分类
最新评论

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

 
阅读更多

只要编译器从上下文中能够推断出类型参数,你就可以使用一个空的类型参数集合(<>)代替调用一个泛型类的构造器所需要的类型参数。 这对尖括号通常叫做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虚拟机规范 Java SE7

    java虚拟机规范 Java SE7 java虚拟机规范 Java SE7 java虚拟机规范 Java SE7

    java虚拟机规范(java SE7)

    第二章:java虚拟结构(运行时区域内存:寄存器,java虚拟机栈,java堆,方法去,运行时常量池,本地方法栈); 第三章:为java虚拟机编译; 第四章:Class文件格式; 第五章:加载、链接与初始化

    Java SE7 API中文文档-类库查询

    Java SE7 API中文文档-类库查询!Java SE7 API中文文档-类库查询!Java SE7 API中文文档-类库查询!Java SE7 API中文文档-类库查询!Java SE7 API中文文档-类库查询!Java SE7 API中文文档-类库查询!

    Java SE7 语言规范手册

    Java SE7 语言规范手册,来自:http://docs.oracle.com/javase/specs/jls/se7/jls7.pdf

    Java虚拟机规范(java se7) 高清文字版本

    于想了解 Java 虚拟机 的程序员来说,《Java 虚拟机规范》是必须阅读的,对于想深入了解 Java 语言细节的程序员, 阅读《Java 虚拟机规范》也有极大好处

    OCP java SE7 Programmer II Certification Guide

    OCP java SE7 Programmer II Certification Guide

    Java虚拟机规范 SE7

    虚拟机 Java 1.7 SE7

    OCA Java SE7 Programmer I认证学习指南(Exam 1Z0-803).rar

    OCA Java SE7 Programmer I认证学习指南(Exam 1Z0-803).rar

    Java虚拟机规范(Java SE7)

    介绍了Java虚拟机的规范,可以挑选自己需要的章节进行读取。

    Java虚拟机规范SE7

    Java Virtual Machine Specification Java SE 7 中文版 Java Virtual Machine Specification Java SE 7 中文版 Java虚拟机规范SE7

    Java虚拟机规范 (Java SE 7 中文版)

    《Java虚拟机规范(Java SE7版)》由林德霍尔姆著,本书完整而准确地阐释了Java虚拟机各方面的细节,围绕.Java虚拟机整体架构、编译器、class文件格式、加载、链接与初始化、指令集等核心主题对Java虚拟机进行全面而...

    java虚拟机规范SE7

    虚拟机方面的权威著作 java虚拟机规范SE7,包含中文版和英文版

    Java SE 7 API文档

    Java SE 7 API文档。jdk7 API文档。Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向...

    java核心技术·卷II·高级特征(第9版·英文版)及源码

    新版做了全面更新,体现了Java SE7的变化,并将对Java SE 7新特性的完整描述融入对Java基本概念的精辟阐述中。  Java核心技术卷II:高级特性(第9版英文版)(上、下册)专为做实际项目的程序员编写,是一本真实可信、...

    Java虚拟机规范SE7.txt

    https://pan.baidu.com/s/1kO1Ng7HW_3I2Us8SpBoesw Java虚拟机规范

    java se 7 api chm

    java se 7 api chm english so salasala ~~yi ya ~~

    se7en管理模板

    se7en管理模板,基于Bootstrap3实现,好资源要多分享

    java虚拟机规范(java se 7)

    《Java虚拟机规范 7》是一份完整的描述Java虚拟机是如何设计的规范文档。这份文档对于任何一个希望实现Java虚拟机的编译器作者,或者希望实现一个与规范相兼容的Java虚拟机的程序员来说都是必不可少的。

    java编程语言英文第四版

    Targeted at intermediate-to-advanced developers, this is the definitive tutorial introduction and reference to the Java SE7 language and its essential libraries. Co-authored by "father of Java" James ...

Global site tag (gtag.js) - Google Analytics