首先為了方便下面**的理解,這裡先提一下一些下面會用到的三個物件:person、student和worker。
person的屬性只有string型別的name和int型別的age,其他就是一些基本的方法
student和worker都是完全繼承person類,都沒有新的屬性
下面開始正題
泛型,字面上理解是乙個廣泛的型別。
在jdk1.4版本之前,容器什麼型別的物件都可以儲存。但是在取出時,需要用到物件的持有內容時,需要做向下轉型。但是物件的型別不一致,導致了向下轉型發生了classcastexception異常。為了避免這個問題,只能主觀上控制,往集合中儲存的物件型別保持一致。
jdk1.5以後解決了這個問題,在定義集合時,就直接明確集合中儲存元素 的具體型別。這樣,編譯器在編譯時,就可以對集合中儲存的物件型別進行檢查。一旦發現型別不匹配,就編譯失敗。這個技術就是泛型技術。
以下是乙個例子
public static void main(string args)
}
這裡的就是泛型的表示
注:這裡額外提醒int的型別的要寫integer
所以泛型具有以下優點:
1:將執行時期的問題轉移到了編譯時期,可以更好的讓程式設計師發現問題並解決問題
2:避免了向下轉型的麻煩
總結:泛型就是應用在編譯時期的一項安全機制
那麼泛型是如何作用的呢?
泛型的擦除:編譯器通過泛型對元素型別進行檢查,只要檢查通過,就會生成class檔案,但在class檔案中,就將泛型標識去掉了
泛型的表現:泛型技術在集合框架中應用的範圍很大。
什麼時候需要寫泛型呢?1:只要看到類,或者介面在描述的時候右邊定義<>,就需要泛型。其實是,容器在不明確操作元素的型別的情況下,對外提供了乙個引數<>。使用容器時,只要將具體的型別實參傳遞給該引數即可。簡單來說,泛型就是,傳遞型別引數。
泛型類:jdk1.4時,型別向上抽取,當要操作的物件型別不確定的時候,為了擴充套件,可以使用object型別來完成,但是這種方式有一種弊端,就是向下轉型容易在執行時期發生classcastexception。因此,jdk1.5以後,新的解決方案來了。就是型別不確定時,可以對外提供引數。有使用者通過傳遞引數的方式完成型別的確定。如下列例子,util就是乙個泛型類
public class genericdemo4
}class util
public final void setobj(w obj)
}
泛型方法:
public class genericdemo5
}class demo
public static void staticshow(a a)
public void print(q w)
}
泛型介面:
public class genericdemo6
}inte***ce inter
//這是第一種用到介面的類,明確了型別是string
class interimpl1 implements inter
}//這是第二種用到介面的類,沒有明確型別,所以還是用的泛型。型別在他的子類subdemo上定義
class interimpl2implements inter
}class subdemo extends interimpl2{}
萬用字元:
在不明確具體型別的情況下,可以使用萬用字元「?」來表示
public class genericdemo7
private static void printcollection(collection<?> coll)
}}
限定
? extends e:接受e型別或者e的子型別,也就是限定了上限
? super e:接受e型別或者e型別的父型別,也就是限定了下限
(1)上限應用
public class genericdemo9 }}
class mytreeset
mytreeset(collection<? extends e> c){}
}
(2)下限應用
public class genericdemo10
};treesetts=new treeset(comp);
ts.add(new student("abc1",21));
ts.add(new student("abc2",28));
ts.add(new student("abc3",23));
ts.add(new student("abc4",25));
treesetts2=new treeset(comp);
ts2.add(new worker("abc1",51));
ts2.add(new worker("abc2",58));
ts2.add(new worker("abc3",53));
ts2.add(new worker("abc4",55));
for(iteratorit=ts.iterator();it.hasnext();)
for(iteratorit=ts2.iterator();it.hasnext();) }}
class youtreeset
}
這裡可以看出,無論是ts還是ts2,他們的父類都是person,所以比較方法用person為型別時,可以被他們使用 Java學習筆記 泛型
注 這裡只簡單介紹了一下泛型最基礎的使用,泛型功能很強大,為了趕課程,關於通用型別部分過後補上。別被我的筆記所誤導 課程中的泛型首先是由泛型集合開始入手的。由前邊的兩個集合arraylist和hashmap可以看出,在使用方便的同時也帶來了很多問題。1,效率低下,集合都是object的型別,使用是需...
java 泛型學習筆記
首先我對泛型的理解就是可以把任何object的子類當做類中的型別,下面是對於泛型的基本定義 public class generict public object getfoo 然後對於泛型 可以有兩個型別或者更多 public class generictt public void setfoo1...
Java學習筆記 泛型
一看到泛型就想到一對尖括號?jdk5以後的jdk的集合中就經常使用,例如collectioncollections 然而jdk5中剛剛出現集合框架的時候,集合框架中的變數都是object,因為系統不知道使用者要使用什麼型別的變數。自從jdk5後,引入了 引數化型別 parameterized typ...