泛型即参数化类型;对Java语言来说,引入泛型最大的好处是安全简单。
泛型的优势
- 编译阶段检测类型安全
- 强制转换都是隐式、自动的(代码复用率高)
在没有使用泛型之前,有些问题是无法再编译阶段被发现的,例如:
List list=new ArrayList();
list.add("123"); // 添加一个字符串
list.add(123); // 添加一个int
((String)list.get(0)).toString();
((String)list.get(1)).toString(); // 报错 java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
如果使用泛型,我们这样的代码是无法通过编译的
List<String> list=new ArrayList<String>();
list.add("123");
list.add(123); // 报错,无法放入int型
常用写法
<String> 指定包含的类型实参为String型
? 即类型通配符,一般是用来代替具体的类型实参
<? extends T>
表示传入的是T的某种子类
<? super T>
表示传入的是T的父类
栗子:
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable {...}
public boolean add(E e){...}
public void display(ArrayList<Integer> list);
public void display(ArrayList<?> list);
public void display(ArrayList<? extends Number> list);
public void display(ArrayList<? super Number> list);