泛型

声明中存在一个或者多个参数类型的类或者接口叫作泛型类或者接口。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原则:

  • 若是要从集合中读取类型T的数据,而且不能写入,能够使用 ? extends 通配符;(Producer Extends)
  • 若是要从集合中写入类型T的数据,而且不须要读取,能够使用 ? super 通配符;(Consumer Super)
  • 若是既要存又要取,那么就不要使用任何通配符。

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());
                }
            }
        }
相关文章
相关标签/搜索