Java泛型之泛型参数
在學(xué)習(xí)編程的過(guò)程中,我覺(jué)得不止要獲得課本的知識(shí),更多的是通過(guò)學(xué)習(xí)技術(shù)知識(shí)提高解決問(wèn)題的能力,這樣我們才能走在最前方,更多Java專(zhuān)業(yè)知識(shí),廣州瘋狂java培訓(xùn)為你講解;
泛型機(jī)制常用的參數(shù)有3個(gè):
“?”代表任意類(lèi)型。如果只指定了,而沒(méi)有extends,則默認(rèn)是允許任意類(lèi)。
extends關(guān)鍵字聲明了類(lèi)型的上界,表示參數(shù)化的類(lèi)型可能是所指定的類(lèi)型,或者是此類(lèi)型的子類(lèi)。
super關(guān)鍵字聲明了類(lèi)型的下界,表示參數(shù)化的類(lèi)型可能是所指定的類(lèi)型,或者是此類(lèi)型的父類(lèi)型,直至Object前提Fruit是Apple和Orange的超類(lèi)。
本章通過(guò)java代碼逐一分析泛型參數(shù)的意義和區(qū)別extends參數(shù):
[java]
public void extend(List list, Fruit fruit){
Fruit now = list.get(0);
System.out.println("now==>" + now);
// Apple a = list.get(0); 無(wú)法通過(guò)編譯
Object o = list.get(0);
System.out.println(o);
// list.add(fruit); //這句話無(wú)法編譯
// list.add(new Object()); // 無(wú)法通過(guò)編譯
list.add(null);//這句可以編譯,因?yàn)閚ull沒(méi)有類(lèi)型信息
}
在上面的例子中,可以明確從list中取得的記錄一定是Fruit,但是無(wú)法確定是Apple,list除了傳入null外,不能添加其他任何參數(shù);分析原因前先看以下的例子:
[java]
public void testExtendType(){
List list = new ArrayList();
List list2 = new ArrayList();
List list3 = new ArrayList();
extend(list2, new Apple());
}
從以上代碼可以看出:
extends關(guān)鍵字聲明了類(lèi)型的上界,表示參數(shù)化的類(lèi)型可能是所指定的類(lèi)型,或者是此類(lèi)型的子類(lèi),List 可以指向 ArrayList()、ArrayList()、ArrayList()等。現(xiàn)在如果傳入的參數(shù)list為new ArrayList(),則此時(shí)你向此list中添加Fruit,則肯定報(bào)錯(cuò)。而讀取數(shù)據(jù)時(shí),不管list是什么類(lèi)型,讀取的數(shù)據(jù)肯定都是Fruit,同時(shí)Fruit也是Object。
通過(guò)以上的分析,知道直接往繼承extends中的列表中添加記錄是不行的,那么如何向extends修飾的list中添加記錄,可以使用泛型方法來(lái)達(dá)到目的:
[java]
public void extendType2(List list, T date){
list.add(date);
}
調(diào)用示例如下:
[java]
public void testExtendType2(){
List list = new ArrayList();
extendType2(list,new Apple());
}
super參數(shù)
super用的不多,只簡(jiǎn)單介紹一下。
[java]
public void superType(List list, Apple apple){
Object o = list.get(0);
System.out.println(o);
// Apple a = list.get(0); // 不能編譯
// Apple apple = list.get(0); // 不能編譯
list.add(apple);
// list.add( new Object()); // 不能編譯
// list.add( new Fruit()); // 不能編譯
}
在以上代碼中,從list中讀取的記錄無(wú)法確定是任何類(lèi)型(除Object),list除了添加Apple外,不能添加任何類(lèi)型的對(duì)象(包括Object)。分析原因前先看以下代碼:
[java]
public void testSuperType(){
List list = new ArrayList();
List list2 = new ArrayList();
superType(list2, new Apple());
}
super關(guān)鍵字聲明了類(lèi)型的下界,表示參數(shù)化的類(lèi)型是所指定的類(lèi)型,或者是此類(lèi)型的父類(lèi)型,直至Object。List 可以引用 List,也可以引用 List,所以無(wú)法保證list中都是Apple,但是可以保證,所有l(wèi)ist引用的都是Apple的父類(lèi),所有向此列表中添加Apple是沒(méi)有問(wèn)題的,而很顯然你向List、List中添加Object、Fruit對(duì)象,肯定失敗,只能夠添加Apple。
?參數(shù)
“?”代表任意類(lèi)型。?可以看做 ? extends Object 的縮寫(xiě)。
[java]
public void wideCardType(List list, Fruit fruit ){
Object o = list.get(0);
System.out.println(list.get(0));
// list.add(fruit); // 不能編譯
// list.add(new Object()); // 不能被編譯
}
[java]
public void testWideCardType(){
/**
* ? 可以看做 ? extends Object 的簡(jiǎn)化版
*/
List list = new ArrayList();
List list2 = new ArrayList();
List list3 = new ArrayList
瘋狂Java培訓(xùn)專(zhuān)注軟件開(kāi)發(fā)培訓(xùn),提升學(xué)員就業(yè)能力,重點(diǎn)提升實(shí)踐動(dòng)手能力。技術(shù)知識(shí)沉淀深厚的老師,讓你感受Java的魅力,激發(fā)你對(duì)于編程的熱愛(ài),讓你在半年的時(shí)間內(nèi)掌握8-10萬(wàn)的代碼量,掌握J(rèn)ava核心技術(shù),成為真正的技術(shù)高手;通過(guò)大量全真企業(yè)項(xiàng)目瘋狂訓(xùn)練,迅速積累項(xiàng)目經(jīng)驗(yàn)。讓你成為技能型的現(xiàn)代化高端人才,迅速獲得高薪就業(yè)!時(shí)間不等人,趕緊聯(lián)系我們吧!瘋狂java培訓(xùn)中心地址:廣州天河區(qū)車(chē)陂灃宏大廈3011。
轉(zhuǎn)載于:https://www.cnblogs.com/gojava/p/3202641.html
總結(jié)
以上是生活随笔為你收集整理的Java泛型之泛型参数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 25个吸引眼球的广告设计
- 下一篇: (Prototype)原型模式的Java