泛型萬用字元是「?」
,可以接受任一定義的引用引數型別,但是我們如果並不想使我麼定義的方法接受所有的引用資料型別,
而是接受某一部分型別怎麼辦呢,此時我們就可以對泛型的進行限定,使我們定義的函式或類更加安全。
例如我們定義如下兩個集合,a1和a2
(此處我們設定
student
是person
的子類)
public static void main(string args)
如果我們要定義乙個方法(且不論這個方法是做什麼的),既能接收a1
又能接受
a2,那麼首先我們就會想到泛型萬用字元「?
」,那就就應該這麼定義
public static void printcollection(collection<?> al) {} //此方法主函式呼叫時即可接受
a1又可
a2,
但是有時我們定義的方法要實現的功能又可能是在某乙個特定的物件內的功能,例如我們定義的方法要用上面集合
中person
類內的特有方法
getname
()方法,那麼此時我們就必須對這個函式接受的內容加以限定,否則就會變的
不再安全,因為這個public static void printcollection(collection<?> al) {}
函式是什麼型別內容的集合都可以接收,
如下面乙個集合a3
存的是字串,它一樣可以接收,但顯然字串裡沒有
getname
()方法,我們的程式會出錯。
arraylista3 = new arraylist();
a3.add("aaaa");
a3.add("bbbb");
這裡我們對函式泛型型別加以限定就派上了用場,限定只接受person
類或是其子類的物件集合,因為它們才有
getname()
方法,才是我們要操作的物件,可以這麼限定
public static void printcollection(collection<? extends person> c)
此處的<? extends person>
即泛型的上限,只可接受
person
或person
的子類,再往裡傳
a3的值已經不行,編譯就通不過。
還有<? super e>
即泛型的下限,只可接受e或者
e的父類,也是對函式的接受型別加以的限定,這就是泛型限定的**,
以及為什麼用泛型的限定。
黑馬程式設計師 泛型的限定原理和使用(二)
看到很多人對泛型上下限有點糾結,我總結了下用法,共同學習進步。那麼泛型限定什麼時候用上限,什麼時候用下限呢?其實限定的原理理解了,這個在使用時是很容易區分的,即使你說不出具體什麼時候用哪個,但是真正遇到時稍加判斷就知道了。為了方面學習與複習,還是總結歸納分析一下。首先看第一篇中我們定義的那個方法,具...
黑馬程式設計師 泛型
泛型定義在類上 class utlis 物件,方法 泛型定義在方法上 public void print 泛型定義在類上和定義在方法上的 區別?泛型定義在類上,想要呼叫同一種方法,不同型別或不同方法的不同型別,要new多次不同型別的類。泛型定義在方法上,想要呼叫同一種方法,不同型別或不同方法的不同型...
黑馬程式設計師 泛型集合
把任何型別物件通過add object obj 放入list中,認為只是object型別 通過get int index 取出list中元素時必須進行強制型別轉換,繁瑣而且容易出現異常 使用map的put object key,object value 和get object key 訪問物件時存在...