声明中存在一个或者多个参数类型的类或者接口叫作泛型类或者接口。java
无限制的通配符类型:?安全
有限制的通配符类型: ? extends E dom
原生态类型:List code
List 和 List<?> : 通配符类型是安全的,原生态类型是不安全的,原生态表明能够将任何类型的数据放进去,可是通配符就不能。递归
不要在新代码中使用原生态类型,这条规则有两个例外。接口
一、在类文字中必须使用原生态类型。get
List.class String[].class Test.class 等等合法 可是List<?>.class 则不合法源码
二、<E extends Numer> 要求实际的参数类型E必须是Numer的一个子类型,包括自身。it
三、泛型方法io
public static <E> Set<E> union (Set<E> s1,Set<E> s2){...}
<E> 表明类型参数列表
Set<E> 表明返回类型
四、递归类型限制。
经过某个包含该类型参数自己的表达式来限制类型参数是容许的,这就是递归类型限制。
五、PECS原则:
jdk 源码示例:
public static <T> void copy(List<? super T> dest, List<? extends T> src) { int srcSize = src.size(); if (srcSize > dest.size()) throw new IndexOutOfBoundsException("Source does not fit in dest"); if (srcSize < COPY_THRESHOLD || (src instanceof RandomAccess && dest instanceof RandomAccess)) { for (int i=0; i<srcSize; i++) dest.set(i, src.get(i)); } else { ListIterator<? super T> di=dest.listIterator(); ListIterator<? extends T> si=src.listIterator(); for (int i=0; i<srcSize; i++) { di.next(); di.set(si.next()); } } }