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()); } } } ```
相關文章
相關標籤/搜索