只要编译器从上下文中能够推断出类型参数,你就可以使用一个空的类型参数集合 (<>
)代替调用一个泛型类的构造器所需要的类型参数。 这对尖括号通常叫做 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
.
相关推荐
8. **动态类型**:Java SE7引入了`钻石操作符`(`<>`),简化了匿名内部类和泛型的使用,以及`try-with-resources`语句,自动关闭资源,提高代码的简洁性和安全性。 9. **字符串池**:字符串在Java中是特殊的,它们的...
Java语言规范是由一群资深的Java开发者撰写的,其中包括James Gosling(Java之父)、Bill Joy、Guy Steele和Gilad Bracha等。这份文档是JSR-000901Java® Language Specification的第七版,即Java SE7版。 **版权...
根据提供的文件信息,“OCP Java SE7 Programmer II Certification Guide”主要针对的是希望获得Oracle Certified Professional (OCP) Java SE7 Programmer II认证的专业人士。本书详细介绍了备考1Z0-804考试所需...
第二章:java虚拟结构(运行时区域内存:寄存器,java虚拟机栈,java堆,方法去,运行时常量池,本地方法栈); 第三章:为java虚拟机编译; 第四章:Class文件格式; 第五章:加载、链接与初始化
《OCA Java SE7 Programmer I认证学习指南(Exam 1Z0-803)》是一本专门为准备Oracle Certified Associate(OCA)Java SE 7 Programmer I考试的考生设计的教材。该认证是Java开发人员入门级别的资格证书,旨在验证候选...
Java虚拟机规范(Java SE7)主要讨论了Java虚拟机(JVM)的规范,其中包括了对JVM的详细描述和操作原理的解释。这份规范文件不仅仅是为那些想要了解Java虚拟机的程序员准备的,对于那些想要深入了解Java语言细节的...
4. **钻石操作符**:在SE7中,创建匿名对象时可以省略泛型的类型参数,使用钻石操作符 `<>`,简化了代码。 5. **文件系统API更新**:NIO.2(New I/O 2.0)引入了更现代、更面向对象的文件系统访问API,提供了异步I/...
### Java SE7 API中文文档-类库查询 #### 概述 本文档旨在提供Java SE7版本中的API中文文档及类库查询指南。这是一份详尽的技术文档,旨在帮助开发者更好地理解和应用Java标准版(Java SE)7中的各类API接口、类与...
4. **改进的类型推断(Improved Type Inference for Generic Instance Creation)**:Java 7允许在创建泛型实例时省略类型参数,编译器会根据上下文自动推断出正确的类型。 5. **菱形操作符(Diamond Operator)**...
### Java虚拟机规范SE7概览 #### 一、引言 《Java虚拟机规范(JavaSE7版)》作为Java编程语言的核心组成部分之一,详细阐述了Java虚拟机(JVM)的设计原则、架构和运行机制。这本书不仅对Java开发者理解和优化代码...
1. 类型推断:在泛型实例化时,编译器可以根据上下文自动推断类型,减少了冗余的类型声明。 2. 钻石运算符:在创建匿名类或泛型实例时,可以省略泛型参数的类型,如`new ArrayList()`。 四、其他改进 1. 对于数组...
3. **钻石操作符**:在创建泛型对象时,可以省略类型参数,编译器会自动推断。 4. **二进制字面量和下划线分隔数字**:可以使用二进制前缀`0b`表示二进制数,数字间可以用下划线提高可读性。 5. **Try-with-...
Java Virtual Machine Specification Java SE 7 中文版 Java Virtual Machine Specification Java SE 7 中文版 Java虚拟机规范SE7
《Java编程语言英文第四版》是由Java之父James Gosling与Ken Arnold和David Holmes共同编写的权威教程,针对中高级开发者,旨在深入介绍Java SE7语言及其核心库。这本书是全球开发者快速掌握Java编程语言、理解其...
《Java虚拟机规范(Java SE7版)》由林德霍尔姆著,本书完整而准确地阐释了Java虚拟机各方面的细节,围绕.Java虚拟机整体架构、编译器、class文件格式、加载、链接与初始化、指令集等核心主题对Java虚拟机进行全面而...
5. 对象:解释了Java中对象的创建和使用,包括了类对象的概述和String类的特殊之处。另外,这部分内容也覆盖了Java中几种基本的数据类型,比如整数类型和值、浮点类型、格式和值以及布尔类型和布尔值。 6. 整型操作...
Java SE 7 API文档。jdk7 API文档。Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向...
Java核心技术每个新版本都尽可能快地跟上Java开发工具箱发展的步伐,而且每一版都重新改写了部分内容,以便适应Java的最新特性,反映了Java标准版(Java SE7)的特性,仍然将读者群定位在那些打算将Java应用到实际工程...