【Java】extends和super泛型限定符

原文鏈接:https://blog.csdn.net/qq_40395278/article/details/88603655

請解釋extends 和super 泛型限定符-上界不存下界不取

extends上限通配符,用來限制類型的上限,只能傳入本類和子類,add方法受阻,可以從一個數據類型裏獲取數據;
super下限通配符,用來限制類型的下限,只能傳入本類和父類,get方法受阻,可以把對象寫入一個數據結構裏;

在java泛型中,? 表示通配符,代表未知類型,< ? extends Object>表示上邊界限定通配符,< ? super Object>表示下邊界限定通配符。

1、通配符 與 T 的區別

T:作用於模板上,用於將數據類型進行參數化,不能用於實例化對象。
?:在實例化對象的時候,不確定泛型參數的具體類型時,可以使用通配符進行對象定義。

< T > 等同於 < T extends Object>
< ? > 等同於 < ? extends Object>

例一:定義泛型類,將key,value的數據類型進行< K, V >參數化,而不可以使用通配符。

public class Container<K, V> {
    private K key;
    private V value;
 
    public Container(K k, V v) {
        key = k;
        value = v;
    }
}

例二:實例化泛型對象,我們不能夠確定eList存儲的數據類型是Integer還是Long,因此我們使用List<? extends Number>定義變量的類型。

List<? extends Number> eList = null;
eList = new ArrayList<Integer>();
eList = new ArrayList<Long>();

2、上界類型通配符(? extends)

List<? extends Number> eList = null;
eList = new ArrayList<Integer>();
Number numObject = eList.get(0);  //語句1,正確
 
//Type mismatch: cannot convert from capture#3-of ? extends Number to Integer
Integer intObject = eList.get(0);  //語句2,錯誤
 
//The method add(capture#3-of ? extends Number) in the type List<capture#3-of ? extends Number> is not applicable for the arguments (Integer)
eList.add(new Integer(1));  //語句3,錯誤

語句1:List<? extends Number>eList存放Number及其子類的對象,語句1取出Number(或者Number子類)對象直接賦值給Number類型的變量是符合java規範的。
語句2:List<? extends Number>eList存放Number及其子類的對象,語句2取出Number(或者Number子類)對象直接賦值給Integer類型(Number子類)的變量是不符合java規範的。
語句3:List<? extends Number>eList不能夠確定實例化對象的具體類型,因此無法add具體對象至列表中,可能的實例化對象如下。

eList = new ArrayList<Integer>();
eList = new ArrayList<Long>();
eList = new ArrayList<Float>();

總結:上界類型通配符add方法受限,但可以獲取列表中的各種類型的數據,並賦值給父類型(extends Number)的引用。因此如果你想從一個數據類型裏獲取數據,使用 ? extends 通配符。限定通配符總是包括自己。

3、下界類型通配符(? super )

List<? super Integer> sList = null;
sList = new ArrayList<Number>();
 
//Type mismatch: cannot convert from capture#5-of ? super Integer to Number
Number numObj = sList.get(0);  //語句1,錯誤
 
//Type mismatch: cannot convert from capture#6-of ? super Integer to Integer
Integer intObj = sList.get(0);  //語句2,錯誤
 
sList.add(new Integer(1));  //語句3,正確

語句1:List<? super Integer> 無法確定sList中存放的對象的具體類型,因此sList.get獲取的值存在不確定性,子類對象的引用無法賦值給兄弟類的引用,父類對象的引用無法賦值給子類的引用,因此語句錯誤。
語句2:同語句1。
語句3:子類對象的引用可以賦值給父類對象的引用,因此語句正確。
總結:下界類型通配符get方法受限,但可以往列表中添加各種數據類型的對象。因此如果你想把對象寫入一個數據結構裏,使用 ? super 通配符。限定通配符總是包括自己。

4、總結
限定通配符總是包括自己
上界類型通配符:add方法受限
下界類型通配符:get方法受限
如果你想從一個數據類型裏獲取數據,使用 ? extends 通配符
如果你想把對象寫入一個數據結構裏,使用 ? super 通配符
如果你既想存,又想取,那就別用通配符
不能同時聲明泛型通配符上界和下界

原文鏈接:https://blog.csdn.net/qq_40395278/article/details/88603655

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章