黑馬程式設計師 泛型的限定原理和使用(二)

2021-06-14 23:28:52 字數 1705 閱讀 5554

看到很多人對泛型上下限有點糾結,我總結了下用法,共同學習進步。

那麼泛型限定什麼時候用上限,什麼時候用下限呢?其實限定的原理理解了,這個在使用時是很容易區分的,即使你說不出具體什麼時候用哪個,但是真正遇到時稍加判斷就知道了。

為了方面學習與複習,還是總結歸納分析一下。

首先看第一篇中我們定義的那個方法,具體實現可以如下:

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 訪問物件時存在...