泛型(Generics)是現代程式語言提供的一種功能,它使得程式設計師不必撰寫功能相同但資料型態不同的程式。
譬如,下面的幾個方法目的都只是在回傳中間的參數,邏輯其實都相同就只是當中所涉及的型態不一樣,若沒有運用泛型語法,我們可能會使用方法多載(Overload)的特性寫了如下的三個方法。雖然只需拷貝方法的內容,或修改變數宣告的資料型態,但這類的工作相當乏味且浪費時間。- String mid(String a, String b, String c)
- {
- return b;
- }
- int mid(int a, int b, int c)
- {
- return b;
- }
- float mid(float a, float b, float c)
- {
- return b;
- }
複製代碼 如果程式允許一種資料型態在撰寫程式時不需要考量真實的資料型態,而能夠在呼叫時才決定真實的資料型態,那就可以省略上述的工作,而程式碼可改寫如下:- <T> T mid(T a, T b, T c)
- {
- return b;
- }
複製代碼 在上列程式碼中,我們使用角括號 <T> 來宣告一個型態持有者,名稱為 T(Type的縮寫),之後就可以用 T 這個名稱作為型態,來宣告成員、參數或返回值的型態。
範例一:泛型方法- public class Ch01 {
- public static void main(String[] args) {
- MyClass obj=new MyClass();
- System.out.println("中間的是: "+obj.mid("哈囉",123,4.5));
- System.out.println("中間的是: "+obj.mid(1.23,"你好",123));
- }
- }
- class MyClass
- {
- <T> T mid(T a, T b, T c)
- {
- return b;
- }
- }
複製代碼
範例二:泛型類別- public class Ch02 {
- public static void main(String[] args) {
- MyClass<String> obj1=new MyClass<String>();
- MyClass<Double> obj2=new MyClass<Double>();
- System.out.println("中間的是: "+obj1.mid("哈囉","123","4.5"));
- System.out.println("中間的是: "+obj2.mid(1.23,4.5,2.3));
- }
- }
- class MyClass<T>
- {
- T mid(T a, T b, T c)
- {
- return b;
- }
- }
複製代碼 |