• Java中的逆变与协变 很直接不饶弯的讲出来了


    ```java
    协变
     extends只能new 辈分比自己低的家伙
         List<? extends Number> list001 = new ArrayList<Integer>();
         初始化可以这样但不能添加非空元素
         下面演示如何接收
     int page=1;
            int rows=10;
            int limit=page*rows;
            int start=(page-1)*rows+1;
            List<Integer> list = new ArrayList<>();
            list.add(3);
            list.add(4);
            test2(list);
            return;
            
       public void test2(List<? extends  Number> arr){
             int i=3;
        }  
    ```    
    
    ```java
    逆变
      List<? super Number> list0011 = new ArrayList<Number>();//可以
            List<? super Number> list002 = new ArrayList<Object>();//可以
            List<? super Number> list00111 = new ArrayList<Integer>();//不可
    super超类 只能new 辈分比自己高与等于的家伙   
    
            list002.add(new Integer(1));
    因为指明辈分等于或高于Number        
    自然可以接收一切Number的子类
    
    
    ```
    逆变协变我用辈分说明,压栈和出栈也可
    ```java
      java.util.Collections的copy方法(JDK1.7)完美地诠释了PECS:
    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());
            }
        }
    }
    ```
  • 相关阅读:
    第三章 p62 或运算
    p57 字符串的长度
    p53 ASCII码
    整数类型,如同时钟
    重要:原码、反码、补码...
    p42 实验溢出(上溢)
    P40 字节单位:KMGT
    p38 二、八、十六进制的对应关系
    p13 数组元素的地址
    p11 内存中的数据和地址
  • 原文地址:https://www.cnblogs.com/kexb/p/10124412.html
Copyright © 2020-2023  润新知