泛型(Generics)是一種參數(shù)化類型機(jī)制,一個類或者方法要處理一個對象一般會使用多態(tài),一是把這個對象定義為接口,就可以處理擴(kuò)展這個接口的對象了,但這種方法有很大的局限性,被處理類要擴(kuò)展這個接口,以前的類不能復(fù)用的個處理類;或者把接受的對象定義為Object,但這種方式要做類型檢查也容易出現(xiàn)ClassCastException。
Java1.5的時候引入泛型的機(jī)制,由于要兼容之前版本的代碼,Java對于泛型只是在編譯器上面動了手腳,所以有一些局限性,后面的章節(jié)會詳細(xì)講解這點。
下面舉一個例子對比泛型帶來的好處
未使用泛型:
List list = new ArrayList();
list.add(1);
list.add("123");
list.add(false);
Object o1 = list.get(0);
String o2 = (String) list.get(1); //會產(chǎn)生ClassCastException
boolean o3 = (Boolean) list.get(2);
可以看出如果要類型轉(zhuǎn)換才能拿到除Object外的類型,如果你拿到其他人寫的方法返回一個list,還有去弄清楚每個元素是什么類型,難以維護(hù)。當(dāng)然我們平時用的時候也不會往一個list放不同類型的對象,但也免不了要查閱list里面約定的是放什么類型和類型轉(zhuǎn)換后才能使用。
使用泛型就可以免除這種煩惱:
List<String> list = new ArrayList<String>();
//List<String> list = new ArrayList<>(); //Java1.7后會自動類型推斷
list.add("123");
//list.add(false); //編譯器會報錯,不允許傳非String的類型
String o2 = list.get(0); //不需要轉(zhuǎn)型,編譯器會幫忙處理
//boolean o3 = list.get(1);//類型不對應(yīng),編譯不通過
使用泛型之后,編譯器會幫我們做類型約束和檢驗,可以使代碼更優(yōu)雅
目錄
學(xué)會Java泛型系列(零):簡介及目錄
學(xué)會Java泛型系列(一):Java泛型
學(xué)會Java泛型系列(二):泛型定義與使用
學(xué)會Java泛型系列(三):泛型原理-擦除
學(xué)會Java泛型系列(四):擦除帶來的問題以及解決辦法
學(xué)會Java泛型系列(五):限定符
學(xué)會Java泛型系列(六):總結(jié)
學(xué)會Java泛型系列(七):常用案例