第26条:请不要使用原生态类型
26.1 泛型介绍
- 如果类/接口的声明中,具有一个或多个类型参数(type parameter),就叫做泛型(generic:通用)类或泛型(通用)接口。泛型类、泛型接口都是泛型(通用)类型(generic type)
public interface List<E> extends Collection<E> {
...
}
- 泛型(通用)类型定义了一组参数化的类型(给定了具体参数的类型),每个参数化的类型都是由类/接口名+<+实际类型参数+>组成,比如List就是这组参数化的类型中的一个,表示它定义的变量,是String的列表。List这里的E叫做形式类型参数
- 原生类型(raw type):不带任何实际类型参数的泛型(通用)类型,List的原生类型为List,原生类型就像从类型声明中删除了所有的泛型信息一样,它们存在主要为了与泛型出现前的代码兼容
- 由于兼容性需要,导致可以将参数化类型转为原生类型,反之也可以
26.2 原生类型缺点
- 不利于查找错误原因
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class Stamp {
private static final Collection stamps = new ArrayList();
public static void main(String[] args) {
stamps.add(new Coin());
for (Iterator i = stamps.iterator(); i.hasNext();) {
Stamp stamp = (Stamp) i.next();
}
}
}
class Coin {
}
- 修正
private static final Collection<Stamp> stamps = new ArrayList();
...
stamps.add(new Coin());
- 虽然原生态类型合法,但永远不要使用它,它只是为了提供兼容性
26.2.1 原生类型List与参数化的类型List