Java泛型中的extends和super理解

在平時看源碼的時候咱們常常看到泛型,且常常會看到extendssuper的使用,看過其餘的文章裏也有講到上界通配符和下屆通配符,總感受講的不夠明白。這裏備註一下,以避免忘記。java

  1. extends也成爲上界通配符,就是指定上邊界。即泛型中的類必須爲當前類的子類或當前類。
  2. super也稱爲下屆通配符,就是指定下邊界。即泛型中的類必須爲當前類或者其父類。

這兩點不難理解,extends修飾的只能取,不能放,這是爲何呢?ui

先看一個列子:spa

public class Food {}
public class Fruit extends Food {}
public class Apple extends Fruit {}
public class Banana extends Fruit{}

public class GenericTest {

    public void testExtends(List<? extends Fruit> list){

        //報錯,extends爲上界通配符,只能取值,不能放.
        //由於Fruit的子類不僅有Apple還有Banana,這裏不能肯定具體的泛型究竟是Apple仍是Banana,因此放入任何一種類型都會報錯
        //list.add(new Apple());

        //能夠正常獲取
        Fruit fruit = list.get(1);
    }

    public void testSuper(List<? super Fruit> list){

        //super爲下界通配符,能夠存放元素,可是也只能存放當前類或者子類的實例,以當前的例子來說,
        //沒法肯定Fruit的父類是否只有Food一個(Object是超級父類)
        //所以放入Food的實例編譯不經過
        list.add(new Apple());
// list.add(new Food());

        Object object = list.get(1);
    }
}
複製代碼

testExtends方法中,由於泛型中用的是extends,在向list中存放元素的時候,咱們並不能肯定List中的元素的具體類型,便可能是Apple也多是Banana。所以調用add方法時,不論傳入new Apple()仍是new Banana(),都會出現編譯錯誤。code

理解了extends以後,再看super就很容易理解了,即咱們不能肯定testSuper方法的參數中的泛型是Fruit的哪一個父類,所以在調用get方法時只能返回Object類型。結合extends可見,在獲取泛型元素時,使用extends獲取到的是泛型中的上邊界的類型(本例子中爲Fruit),範圍更小。get

總結:

在使用泛型時,存取元素時用super,獲取元素時,用extends源碼

相關文章
相關標籤/搜索