看到很多人對泛型上下限有點糾結,我總結了下用法,共同學習進步。
那麼泛型限定什麼時候用上限,什麼時候用下限呢?其實限定的原理理解了,這個在使用時是很容易區分的,即使你說不出具體什麼時候用哪個,但是真正遇到時稍加判斷就知道了。
為了方面學習與複習,還是總結歸納分析一下。
首先看第一篇中我們定義的那個方法,具體實現可以如下:
public static void printcollection(collection<? extends person> c)
上篇中提到我們定義的方法是既能接收a1(person
)又能接受a2(student
),我們為什麼要這樣的,原因很簡單,就是我們想用父類的方法,子類也有,順便就可以接受了拿來用。
要用person
裡面的東西,所以我們要接受
person
或person
子類,或者如果我們往乙個集合中存入另乙個包含某類物件的集合,比如我們往乙個
treeset
裡存入collection
,此時當然也可以接收
person
子類的collection
集合,即
treeset(collection
<? extends e> c),因為我們存的目標是person
,取出時當然用接受
person
的東西來取,用的也都是
person
的方法,它的子類照樣可以被做為
person
,這其實也是變相的多型體現,用上限,這很容易理解,畢老師管它叫做裝入集合時用上限。
那麼什麼時候用下限呢?這種情況就是我們並不是要使用集合內的物件本身,而是拿來這些物件,對這些物件進行一些操作,比如,比較。例如我們要定義乙個比較器comparator
來對treeset
內的student
物件進行比較,此時就往
treeset
內傳比較器,即
treeset(comparator
comparator)
這裡我們也可以用
treeset(comparator
comparator)
因為student
是person
子類,能接受
person
的比較器自然也能接受
person
的子類,這裡就可以寫成
treeset(comparator<? super e> comparator) ,
即泛型下限,這裡接收的比較器即可以是要比較物件的,也可以是要比較物件的父類的,這其實也是多型體現。
這裡總結下:*
要往集合中儲存集合時,集合不僅要操作儲存物件,還要拿出來用,也就是要拿出來集合內的物件來使用其特定方法時,這個集合引數用泛型上限。
----
存物件的集合引數用上取
*要把集合中元素取出來時,就是對整體物件的操作,整體操作一下就完事了,操作物件的這個東西的引數用泛型下限。
-------
取物件的引數集合用下限
即假設a extends b extends c
我們想要要存b
時,也能存順便接受
a(因為我們既然想存
b,那麼肯定是以後是想用
b,裡面有
a也無妨),後來要取
b時,能用
b的接收器取,也能用
c的接收器取。
黑馬程式設計師 泛型限定原理和使用(一)
泛型萬用字元是 可以接受任一定義的引用引數型別,但是我們如果並不想使我麼定義的方法接受所有的引用資料型別,而是接受某一部分型別怎麼辦呢,此時我們就可以對泛型的進行限定,使我們定義的函式或類更加安全。例如我們定義如下兩個集合,a1和a2 此處我們設定 student 是person 的子類 publi...
黑馬程式設計師 泛型
泛型定義在類上 class utlis 物件,方法 泛型定義在方法上 public void print 泛型定義在類上和定義在方法上的 區別?泛型定義在類上,想要呼叫同一種方法,不同型別或不同方法的不同型別,要new多次不同型別的類。泛型定義在方法上,想要呼叫同一種方法,不同型別或不同方法的不同型...
黑馬程式設計師 泛型集合
把任何型別物件通過add object obj 放入list中,認為只是object型別 通過get int index 取出list中元素時必須進行強制型別轉換,繁瑣而且容易出現異常 使用map的put object key,object value 和get object key 訪問物件時存在...