`
jaesonchen
  • 浏览: 312967 次
  • 来自: ...
社区版块
存档分类
最新评论

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 . 

分享到:
评论

相关推荐

    java虚拟机规范 Java SE7

    8. **动态类型**:Java SE7引入了`钻石操作符`(`&lt;&gt;`),简化了匿名内部类和泛型的使用,以及`try-with-resources`语句,自动关闭资源,提高代码的简洁性和安全性。 9. **字符串池**:字符串在Java中是特殊的,它们的...

    Java SE7 语言规范手册

    Java语言规范是由一群资深的Java开发者撰写的,其中包括James Gosling(Java之父)、Bill Joy、Guy Steele和Gilad Bracha等。这份文档是JSR-000901Java® Language Specification的第七版,即Java SE7版。 **版权...

    OCP java SE7 Programmer II Certification Guide

    根据提供的文件信息,“OCP Java SE7 Programmer II Certification Guide”主要针对的是希望获得Oracle Certified Professional (OCP) Java SE7 Programmer II认证的专业人士。本书详细介绍了备考1Z0-804考试所需...

    java虚拟机规范(java SE7)

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

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

    《OCA Java SE7 Programmer I认证学习指南(Exam 1Z0-803)》是一本专门为准备Oracle Certified Associate(OCA)Java SE 7 Programmer I考试的考生设计的教材。该认证是Java开发人员入门级别的资格证书,旨在验证候选...

    Java虚拟机规范(Java SE7)

    Java虚拟机规范(Java SE7)主要讨论了Java虚拟机(JVM)的规范,其中包括了对JVM的详细描述和操作原理的解释。这份规范文件不仅仅是为那些想要了解Java虚拟机的程序员准备的,对于那些想要深入了解Java语言细节的...

    java虚拟机规范SE7

    4. **钻石操作符**:在SE7中,创建匿名对象时可以省略泛型的类型参数,使用钻石操作符 `&lt;&gt;`,简化了代码。 5. **文件系统API更新**:NIO.2(New I/O 2.0)引入了更现代、更面向对象的文件系统访问API,提供了异步I/...

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

    ### Java SE7 API中文文档-类库查询 #### 概述 本文档旨在提供Java SE7版本中的API中文文档及类库查询指南。这是一份详尽的技术文档,旨在帮助开发者更好地理解和应用Java标准版(Java SE)7中的各类API接口、类与...

    JavaSE7 API 帮助文档

    4. **改进的类型推断(Improved Type Inference for Generic Instance Creation)**:Java 7允许在创建泛型实例时省略类型参数,编译器会根据上下文自动推断出正确的类型。 5. **菱形操作符(Diamond Operator)**...

    Java虚拟机规范 SE7

    ### Java虚拟机规范SE7概览 #### 一、引言 《Java虚拟机规范(JavaSE7版)》作为Java编程语言的核心组成部分之一,详细阐述了Java虚拟机(JVM)的设计原则、架构和运行机制。这本书不仅对Java开发者理解和优化代码...

    Java SE 7 官方文档

    1. 类型推断:在泛型实例化时,编译器可以根据上下文自动推断类型,减少了冗余的类型声明。 2. 钻石运算符:在创建匿名类或泛型实例时,可以省略泛型参数的类型,如`new ArrayList()`。 四、其他改进 1. 对于数组...

    java7 jdk7+jre7 64位

    3. **钻石操作符**:在创建泛型对象时,可以省略类型参数,编译器会自动推断。 4. **二进制字面量和下划线分隔数字**:可以使用二进制前缀`0b`表示二进制数,数字间可以用下划线提高可读性。 5. **Try-with-...

    Java虚拟机规范SE7

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

    java编程语言英文第四版

    《Java编程语言英文第四版》是由Java之父James Gosling与Ken Arnold和David Holmes共同编写的权威教程,针对中高级开发者,旨在深入介绍Java SE7语言及其核心库。这本书是全球开发者快速掌握Java编程语言、理解其...

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

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

    The java language specification(JavaSE7)

    5. 对象:解释了Java中对象的创建和使用,包括了类对象的概述和String类的特殊之处。另外,这部分内容也覆盖了Java中几种基本的数据类型,比如整数类型和值、浮点类型、格式和值以及布尔类型和布尔值。 6. 整型操作...

    Java SE 7 API文档

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

    JAVA核心课程 基础讲解 Java类库 应用程序编程接口

    Java核心技术每个新版本都尽可能快地跟上Java开发工具箱发展的步伐,而且每一版都重新改写了部分内容,以便适应Java的最新特性,反映了Java标准版(Java SE7)的特性,仍然将读者群定位在那些打算将Java应用到实际工程...

Global site tag (gtag.js) - Google Analytics