Java 中泛型使用

引出泛型的概念

    public static void main(String[] args) {
        List list = new ArrayList();
        list.add("1");
        //list.add(false);//1
        list.add(100);//2
        int len = list.size();
        for (int i = 0; i < len; i++) {
            String value = (String) list.get(i); // 1
            System.out.println("value:" + value);
        }
    }

以上代碼就不用解釋了,大家一看就明白,但是會出異常,信息如下

代碼1處:
value:1Exception in thread "main" 
java.lang.ClassCastException: java.lang.Boolean cannot be cast to java.lang.String
    at MianTest.main(MianTest.java:16)
代碼2處:   
value:1
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
    at MianTest.main(MianTest.java:16)

以上代碼存在兩個問題:

  • 集合不會記住此對象的類型
  • 強制轉換類型會出錯

泛型

泛型,即“參數化類型”一提到參數,最熟悉的就是定義方法時有形參,然後調用此方法時傳遞實參。
顧名思義,就是將類型由原來的具體的類型參數化,類似於方法中的變量參數,此時類型也定義成參數形式(可以稱之爲類型形參),然後在使用/調用時傳入具體的類型(類型實參)。
常常用T、E、K、V等形式的參數常用於表示泛型形參,用來接收來自外部使用時候傳入的類型實參

T爲形參,外部可以傳進來實參

public class GenericModel<T> {
    private T mData;

    public GenericModel(T t) {
        this.mData = t;
    }

    public T getData() {
        return mData;
    }

    public void setmata(T mData) {
        this.mData = mData;
    }

}

具體使用:

public static void main(String[] args) {
        GenericModel<Boolean> z = new GenericModel<Boolean>(false);
         GenericModel<String> one = new GenericModel<String>("1");
         GenericModel<Integer> two = new GenericModel<Integer>(1);
         System.out.println("z"+z.getData());
         System.out.println("one"+one.getData());
         System.out.println("two"+two.getData());
}

結果:

zfalse
oneaaa
two1

問題1: 那麼對於不同傳入的類型實參,生成的相應對象實例的類型是不是一樣的呢?

答:泛型類型在邏輯上看以看成是多個不同的類型,實際上都是相同的基本類型

補充

我們發現,在使用泛型類時,雖然傳入了不同的泛型實參,但並沒有真正意義上生成不同的類型,傳入不同泛型實參的泛型類在內存上只有一個,即還是原來的最基本的類型,當然,在邏輯上我們可以理解成多個不同的泛型類型。

究其原因,在於Java中的泛型這一概念提出的目的,導致其只是作用於代碼編譯階段,在編譯過程中,對於正確檢驗泛型結果後,會將泛型的相關信息擦出,也就是說,成功編譯過後的class文件中是不包含任何泛型信息的。泛型信息不會進入到運行時階段。

參考

發佈了18 篇原創文章 · 獲贊 32 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章