跳至主要內容

03. Java菱形运算符指南

LiuSongLing大约 2 分钟javajavalist

了解菱形运算符,以及泛型和 Collection API 演变。

1.原始类型

在 Java 1.5 之前,Collections API 仅支持原始类型——在构造集合时无法参数化类型参数:

List cars = new ArrayList();
cars.add(new Object());
cars.add("car");
cars.add(new Integer(1));

这导致集合允许添加任何类型,运行时会出现潜在的强制转换异常。

2.泛型

在 Java 1.5 中,引入了泛型——这允许我们在声明和构造对象时参数化类的类型参数,包括集合 API 中的类:

List<String> cars = new ArrayList<String>();

我们必须在构造函数中指定参数化类型, 不指定的话,它也会提示我们一条警告消息:

List<String> generics = new ArrayList<String>();
List<String> raws = new ArrayList();

ArrayList is a raw type. References to generic type ArrayList<E> should be parameterized

3.菱形运算符

在 Java 1.7 中引入 – 在使用泛型时,它增加了类型推断并减少了赋值中的冗长说明:

List<String> cars = new ArrayList<>();

Java 1.7 编译器的类型推理功能确定与调用匹配的最合适的构造函数声明。

以下接口和类层次结构分别处理车辆和引擎:

public interface Engine { }
public class Diesel implements Engine { }
public interface Vehicle<T extends Engine> { }
public class Car<T extends Engine> implements Vehicle<T> { }

创建一个 Car的新实例是这样:

Car<Diesel> myCar = new Car<>();

在内部,编译器知道 Diesel 实现了 Engine 接口,然后能够通过推断类型来确定合适的构造函数。

简单地说,菱形运算符向编译器添加了类型推断功能,并减少了泛型引入的赋值的冗长解释说明。