夏眠鱼

Oct 19, 2017

Java 泛型-原始类型

原始类型(Raw Type)是指没有类型参数(Type Argument)的泛型类或接口。

要创建一个 Box<T> 的参数化类型,你需要给类型参数 T 赋予一个实际的类型参数:

1
Box<Integer> intBox = new Box<>();

如果实际的类型参数被省略,你就会创建一个 Box<T> 的原始类型:

1
Box intBox = new Box();

因此,Box 是泛型 Box<T> 的原始类型。但是,一个非泛型的类或接口不是原始类型

由于 JDK 5.0 之前 API 中的很多类(比如集合类)是不支持泛型的,所以原始类型出现在旧有代码中。为了向后兼容,允许将一个参数化类型指向原始类型的:

1
2
Box<String> stringBox = new Box<>();
Box rawBox = stringBox; // 正确

但是如果你将一个原始类型指向一个参数化类型就会得到一个警告:

1
2
Box rawBox = new Box(); // rawBox 是 `Box<T>` 的原始类型
Box<Integer> intBox = rawBox; // 产生「未检查转换(unchecked conversion)」的警告

如果你使用原始类型来调用相应泛型中定义的泛型方法,你也会得到一个警告:

1
2
3
Box<String> stringBox = new Box<>();
Box rawBox = stringBox;
rawBox.set(8); // 产生「未检查转换成 set(T) 」的警告

警告表明,原始类型会绕过泛型检查,将不安全代码的捕获推迟到运行时。因此,你应该避免使用原始类型

OLDER > < NEWER