Java泛型三:通配符详解extends super
在java泛型中,? 表示通配符,代表未知類型,< ? extends Object>表示上邊界限定通配符,< ? super Object>表示下邊界限定通配符。
通配符 與 T 的區別
T:作用于模板上,用于將數據類型進行參數化,不能用于實例化對象。?
?:在實例化對象的時候,不確定泛型參數的具體類型時,可以使用通配符進行對象定義。
< T > 等同于 < T extends Object>
< ? > 等同于 < ? extends Object>
1
2
例一:定義泛型類,將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;
? ? }
}
1
2
3
4
5
6
7
8
9
例二:實例化泛型對象,我們不能夠確定eList存儲的數據類型是Integer還是Long,因此我們使用List<? extends Number>定義變量的類型。
List<? extends Number> eList = null;
eList = new ArrayList<Integer>();
eList = new ArrayList<Long>();
1
2
3
上界類型通配符(? 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
2
3
4
5
6
7
8
9
語句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>();
1
2
3
總結:上界類型通配符add方法受限,但可以獲取列表中的各種類型的數據,并賦值給父類型(extends Number)的引用。因此如果你想從一個數據類型里獲取數據,使用 ? extends 通配符。限定通配符總是包括自己。
下界類型通配符(? 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
2
3
4
5
6
7
8
9
10
語句1:List<? super Integer> 無法確定sList中存放的對象的具體類型,因此sList.get獲取的值存在不確定性,子類對象的引用無法賦值給兄弟類的引用,父類對象的引用無法賦值給子類的引用,因此語句錯誤。?
語句2:同語句1。?
語句3:子類對象的引用可以賦值給父類對象的引用,因此語句正確。?
總結:下界類型通配符get方法受限,但可以往列表中添加各種數據類型的對象。因此如果你想把對象寫入一個數據結構里,使用 ? super 通配符。限定通配符總是包括自己。
總結
限定通配符總是包括自己
上界類型通配符:add方法受限
下界類型通配符:get方法受限
如果你想從一個數據類型里獲取數據,使用 ? extends 通配符
如果你想把對象寫入一個數據結構里,使用 ? super 通配符
如果你既想存,又想取,那就別用通配符
不能同時聲明泛型通配符上界和下界
---------------------?
作者:zhiboer?
來源:CSDN?
原文:https://blog.csdn.net/claram/article/details/51943742?
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
總結
以上是生活随笔為你收集整理的Java泛型三:通配符详解extends super的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Git 教程 菜单
- 下一篇: 【Java】泛型中 extends 和