只要编译器从上下文中能够推断出类型参数,你就可以使用一个空的类型参数集合(<>
)代替调用一个泛型类的构造器所需要的类型参数。
这对尖括号通常叫做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虚拟机栈,java堆,方法去,运行时常量池,本地方法栈); 第三章:为java虚拟机编译; 第四章:Class文件格式; 第五章:加载、链接与初始化
Java SE7 API中文文档-类库查询!Java SE7 API中文文档-类库查询!Java SE7 API中文文档-类库查询!Java SE7 API中文文档-类库查询!Java SE7 API中文文档-类库查询!Java SE7 API中文文档-类库查询!
Java SE7 语言规范手册,来自:http://docs.oracle.com/javase/specs/jls/se7/jls7.pdf
于想了解 Java 虚拟机 的程序员来说,《Java 虚拟机规范》是必须阅读的,对于想深入了解 Java 语言细节的程序员, 阅读《Java 虚拟机规范》也有极大好处
OCP java SE7 Programmer II Certification Guide
虚拟机 Java 1.7 SE7
OCA Java SE7 Programmer I认证学习指南(Exam 1Z0-803).rar
介绍了Java虚拟机的规范,可以挑选自己需要的章节进行读取。
Java Virtual Machine Specification Java SE 7 中文版 Java Virtual Machine Specification Java SE 7 中文版 Java虚拟机规范SE7
《Java虚拟机规范(Java SE7版)》由林德霍尔姆著,本书完整而准确地阐释了Java虚拟机各方面的细节,围绕.Java虚拟机整体架构、编译器、class文件格式、加载、链接与初始化、指令集等核心主题对Java虚拟机进行全面而...
虚拟机方面的权威著作 java虚拟机规范SE7,包含中文版和英文版
Java SE 7 API文档。jdk7 API文档。Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向...
新版做了全面更新,体现了Java SE7的变化,并将对Java SE 7新特性的完整描述融入对Java基本概念的精辟阐述中。 Java核心技术卷II:高级特性(第9版英文版)(上、下册)专为做实际项目的程序员编写,是一本真实可信、...
https://pan.baidu.com/s/1kO1Ng7HW_3I2Us8SpBoesw Java虚拟机规范
java se 7 api chm english so salasala ~~yi ya ~~
se7en管理模板,基于Bootstrap3实现,好资源要多分享
《Java虚拟机规范 7》是一份完整的描述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 ...