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());
        }
    }
}
```

 

posted on 2018-12-15 19:42  听哥哥的话  阅读(164)  评论(0编辑  收藏  举报

导航