Java 快速導覽 - 物件導向概念 泛型

由於 Java 有嚴格的型態限制,因此成員 (member) 宣告為那一種型態,就只能使用該種型態的資料,後來 Java 5.0 後加入了泛型 (generic) 的特性,使型態使用可以具有某種彈性。



舉例如下
class Animal<T> {
    private T age;
    private T weight;
    
    public Animal(T a, T w) {
        setAge(a);
        setWeight(w);
    }
    
    public T getAge() {
        return age;
    }

    public void setAge(T n) {
        age = n;
    }
    
    public T getWeight() {
        return weight;
    }
    
    public void setWeight(T n) {
        weight = n;
    }
    
    public void speak() {
        System.out.println("哈囉,我已經" + getAge() + "歲,有" + getWeight() + "公斤重");
    }
}

class GenericDemo {
    public static void main(String[] args) {
        Animal puppy1, puppy2; 
        puppy1 = new Animal(6, "70");
        puppy2 = new Animal("八十八", "五千");
        
        puppy1.speak();
        puppy2.speak();
    }
}

/* 《程式語言教學誌》的範例程式
    http://pydoing.blogspot.com/
    檔名:GenericDemo.java
    功能:示範物件導向的基本觀念 
    作者:張凱慶
    時間:西元 2010 年 10 月 */


編譯後執行,結果如下



我們暫時不管編譯器 (compiler) 的警告訊息,第 1 行
class Animal<T> {


這裡的 <T> ,就是角括號圍起來的大寫字母 T ,這是一個識別字,表示 Type 的縮寫,意思是 Animal 中任何使用 T 的地方,無論傳入何種型態,如 int 或 String 等,這裡的 T 都會被代換成 int 或 String 。


泛型在 Collection 相關的型態很常用到,這是由於陣列 (array) 會在編譯時期進行型態檢查,直接挑出錯誤,然而 Collection 的型態在編譯時會過關,反而在執行時才會出錯。使用泛型可使問題由編譯器挑出來,因此提供了更好的型態安全性。



中英文術語對照
成員member
泛型generic
編譯器compiler
陣列array






3 則留言:

Unknown 提到...

請問傳入的型態若是object型態也適用嗎?

Kaiching Chang 提到...

T 可以是任意的物件型態,但必須是相同的物件型態唷
^_^

悠遊卡 提到...

https://www.blogger.com/profile/10096342137342970684