在平時看源碼的時候咱們常常看到泛型,且常常會看到extends
和super
的使用,看過其餘的文章裏也有講到上界通配符和下屆通配符,總感受講的不夠明白。這裏備註一下,以避免忘記。java
extends
也成爲上界通配符,就是指定上邊界。即泛型中的類必須爲當前類的子類或當前類。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
。源碼