JAVA 泛型詳解

1. 概述

泛型在java中有很重要的地位,在面向對象編程及各種設計模式中有非常廣泛的應用。                                                                                          

什麼是泛型?爲什麼要使用泛型?

泛型,即“參數化類型”。一提到參數,最熟悉的就是定義方法時有形參,然後調用此方法時傳遞實參。那麼參數化類型怎麼理解呢?顧名思義,就是將類型由原來的具體的類型參數化,類似於方法中的變量參數,此時類型也定義成參數形式(可以稱之爲類型形參),然後在使用/調用時傳入具體的類型(類型實參)。

泛型的本質是爲了參數化類型(在不創建新的類型的情況下,通過泛型指定的不同類型來控制形參具體限制的類型)。也就是說在泛型使用過程中,操作的數據類型被指定爲一個參數,這種參數類型可以用在類、接口和方法中,分別被稱爲泛型類、泛型接口、泛型方法。


2. 一個栗子

一個被舉了無數次的例子:

List arrayList = new ArrayList();

arrayList.add("aaaa");

arrayList.add(100);for(int i = 0; i< arrayList.size();i++){

    String item = (String)arrayList.get(i);

    Log.d("泛型測試","item = " + item);

}


毫無疑問,程序的運行結果會以崩潰結束:

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

ArrayList可以存放任意類型,例子中添加了一個String類型,添加了一個Integer類型,再使用時都以String的方式使用,因此程序崩潰了。爲了解決類似這樣的問題(在編譯階段就可以解決),泛型應運而生。

我們將第一行聲明初始化list的代碼更改一下,編譯器會在編譯階段就能夠幫我們發現類似這樣的問題。

List arrayList = new ArrayList();

...

//arrayList.add(100); 在編譯階段,編譯器就會報錯


3. 特性

泛型只在編譯階段有效。看下面的代碼:

List stringArrayList =newArrayList();

List integerArrayList =newArrayList();

Class classStringArrayList = stringArrayList.getClass();

Class classIntegerArrayList = integerArrayList.getClass();

if(classStringArrayList.equals(classIntegerArrayList)){ 

  Log.d("泛型測試","類型相同");

}

4.3 泛型類

泛型類型用於類的定義中,被稱爲泛型類。通過泛型可以完成對一組類的操作對外開放相同的接口。最典型的就是各種容器類,如:List、Set、Map。

泛型類的最基本寫法(這麼看可能會有點暈,會在下面的例子中詳解):

class 類名稱 <泛型標識:可以隨便寫任意標識號,標識指定的泛型的類型>{                                                                                                                        private泛型標識 /*(成員變量類型)*/ var;                                                                                                                                                                    .....              }   }                                                                                                                                                                                                                     


一個最普通的泛型類:

//此處T可以隨便寫爲任意標識,常見的如T、E、K、V等形式的參數常用於表示泛型//在實例化泛型類時,必須指定T的具體類型publicclassGeneric{//key這個成員變量的類型爲T,T的類型由外部指定      privateT key;publicGeneric(T key) {//泛型構造方法形參key的類型也爲T,T的類型由外部指定this.key = key;    }publicTgetKey(){//泛型方法getKey的返回值類型爲T,T的類型由外部指定returnkey;    }}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章