未引入泛型之前
public class ArrayList {
private Object[] elementData;
public Object get(int i) {...}
public void add(Object o) {...}
}
这种方法有两个问题:
- 当获取一个值时必须进行强制类型转换
ArrayList files = new ArrayList();
...
String filename = (String) files.get(0);
2, 没有错误检查,可以向数组列表中添加任何类的对象
files.add(new File("...")); //
对于这个调用,编译和运行都不会出错
在其他地方,如果将get的结果强制类型转换为String类型,就会产生一个错误
引入泛型后
首先,虚拟机没有泛型类型的对象—所有对象都属于普通类。
无论何是定义一个泛型类型,都自动提供一个相应的原始类型 。原始类型的名字就是删去类型参数后的泛型类型名。擦除类型变量,并替换为限定类型(无限定类型的变量使用Object)。
好处
Java中引入泛型最主要的目的是
- 将类型检查工作提前到编译时期,
- 将类型强转(cast)工作交给编译器
- ,从而让你在编译时期就获得类型转换异常以及去掉源码中的类型强转代码。