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