zoukankan      html  css  js  c++  java
  • 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());
            }
        }
    }
    ```
  • 相关阅读:
    安卓中期小作业
    安卓大作业UI预定搞
    实验3
    实验一总结
    实验8 SQLite数据库操作
    实验6 在应用程序中播放音频和视频
    实验4 颜色、字符串资源的使用
    实验四
    实验三
    实验二
  • 原文地址:https://www.cnblogs.com/kexb/p/10124412.html
Copyright © 2011-2022 走看看