Java 泛型有哪些好處詳解
java 泛型
概要:
Java 泛型是java SE 1.5的新特性,泛型的本質(zhì)是參數(shù)化類型,也就是說(shuō)所操作的數(shù)據(jù)類型被指定為一個(gè)參數(shù)。這種參數(shù)類型可以用在類、接口和方法的創(chuàng)建中,分別稱為泛型類、泛型接口、泛型方法。
泛型(Generic type 或者 generics)是對(duì) Java 語(yǔ)言的類型系統(tǒng)的一種擴(kuò)展,以支持創(chuàng)建可以按類型進(jìn)行參數(shù)化的類??梢园杨愋蛥?shù)看作是使用參數(shù)化類型時(shí)指定的類型的一個(gè)占位符,就像方法的形式參數(shù)是運(yùn)行時(shí)傳遞的值的占位符一樣。
可以在集合框架(Collection framework)中看到泛型的動(dòng)機(jī)。例如,Map 類允許您向一個(gè) Map 添加任意類的對(duì)象,即使最常見(jiàn)的情況是在給定映射(map)中保存某個(gè)特定類型(比如 String)的對(duì)象。
因?yàn)?Map.get() 被定義為返回 Object,所以一般必須將 Map.get() 的結(jié)果強(qiáng)制類型轉(zhuǎn)換為期望的類型,如下面的代碼所示:
Map m = new HashMap(); m.put("key", "blarg"); String s = (String) m.get("key");
要讓程序通過(guò)編譯,必須將 get() 的結(jié)果強(qiáng)制類型轉(zhuǎn)換為 String,并且希望結(jié)果真的是一個(gè) String。但是有可能某人已經(jīng)在該映射中保存了不是 String 的東西,這樣的話,上面的代碼將會(huì)拋出 ClassCastException。
理想情況下,您可能會(huì)得出這樣一個(gè)觀點(diǎn),即 m 是一個(gè) Map,它將 String 鍵映射到 String 值。這可以讓您消除代碼中的強(qiáng)制類型轉(zhuǎn)換,同時(shí)獲得一個(gè)附加的類型檢查層,該檢查層可以防止有人將錯(cuò)誤類型的鍵或值保存在集合中。這就是泛型所做的工作。
泛型的好處
Java 語(yǔ)言中引入泛型是一個(gè)較大的功能增強(qiáng)。不僅語(yǔ)言、類型系統(tǒng)和編譯器有了較大的變化,以支持泛型,而且類庫(kù)也進(jìn)行了大翻修,所以許多重要的類,比如集合框架,都已經(jīng)成為泛型化的了。
這帶來(lái)了很多好處:
1,類型安全。 泛型的主要目標(biāo)是提高 Java 程序的類型安全。通過(guò)知道使用泛型定義的變量的類型限制,編譯器可以在一個(gè)高得多的程度上驗(yàn)證類型假設(shè)。沒(méi)有泛型,這些假設(shè)就只存在于程序員的頭腦中(或者如果幸運(yùn)的話,還存在于代碼注釋中)。
2,消除強(qiáng)制類型轉(zhuǎn)換。 泛型的一個(gè)附帶好處是,消除源代碼中的許多強(qiáng)制類型轉(zhuǎn)換。這使得代碼更加可讀,并且減少了出錯(cuò)機(jī)會(huì)。
3,潛在的性能收益。 泛型為較大的優(yōu)化帶來(lái)可能。在泛型的初始實(shí)現(xiàn)中,編譯器將強(qiáng)制類型轉(zhuǎn)換(沒(méi)有泛型的話,程序員會(huì)指定這些強(qiáng)制類型轉(zhuǎn)換)插入生成的字節(jié)碼中。但是更多類型信息可用于編譯器這一事實(shí),為未來(lái)版本的 JVM 的優(yōu)化帶來(lái)可能。由于泛型的實(shí)現(xiàn)方式,支持泛型(幾乎)不需要 JVM 或類文件更改。所有工作都在編譯器中完成,編譯器生成類似于沒(méi)有泛型(和強(qiáng)制類型轉(zhuǎn)換)時(shí)所寫的代碼,只是更能確保類型安全而已。
Java語(yǔ)言引入泛型的好處是安全簡(jiǎn)單。泛型的好處是在編譯的時(shí)候檢查類型安全,并且所有的強(qiáng)制轉(zhuǎn)換都是自動(dòng)和隱式的,提高代碼的重用率。
泛型在使用中還有一些規(guī)則和限制:
1、泛型的類型參數(shù)只能是類類型(包括自定義類),不能是簡(jiǎn)單類型。
2、同一種泛型可以對(duì)應(yīng)多個(gè)版本(因?yàn)閰?shù)類型是不確定的),不同版本的泛型類實(shí)例是不兼容的。
3、泛型的類型參數(shù)可以有多個(gè)。
4、泛型的參數(shù)類型可以使用extends語(yǔ)句,例如<T extends superclass>。習(xí)慣上成為“有界類型”。
5、泛型的參數(shù)類型還可以是通配符類型。例如Class<?> classType = Class.forName(Java.lang.String);
泛 型還有接口、方法等等,內(nèi)容很多,需要花費(fèi)一番功夫才能理解掌握并熟練應(yīng)用。在此給出我曾經(jīng)了解泛型時(shí)候?qū)懗龅膬蓚€(gè)例子(根據(jù)看的印象寫的),實(shí)現(xiàn)同樣的 功能,一個(gè)使用了泛型,一個(gè)沒(méi)有使用,通過(guò)對(duì)比,可以很快學(xué)會(huì)泛型的應(yīng)用,學(xué)會(huì)這個(gè)基本上學(xué)會(huì)了泛型70%的內(nèi)容。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
java 轉(zhuǎn)發(fā)和重定向區(qū)別及實(shí)例代碼
這篇文章主要介紹了java 轉(zhuǎn)發(fā)和重定向區(qū)別及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2016-11-11基于Java實(shí)現(xiàn)無(wú)向環(huán)和有向環(huán)的檢測(cè)
這篇文章主要介紹了如何在?Java?中實(shí)現(xiàn)無(wú)向環(huán)和有向環(huán)的檢測(cè),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Java有一定的幫助,需要的可以參考一下2022-04-04劍指Offer之Java算法習(xí)題精講N叉樹(shù)的遍歷及數(shù)組與字符串
跟著思路走,之后從簡(jiǎn)單題入手,反復(fù)去看,做過(guò)之后可能會(huì)忘記,之后再做一次,記不住就反復(fù)做,反復(fù)尋求思路和規(guī)律,慢慢積累就會(huì)發(fā)現(xiàn)質(zhì)的變化2022-03-03Java Swing JCheckBox復(fù)選框的實(shí)現(xiàn)方法
這篇文章主要介紹了Java Swing JCheckBox復(fù)選框的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12Spring boot 應(yīng)用實(shí)現(xiàn)動(dòng)態(tài)刷新配置詳解
這篇文章主要介紹了spring boot 配置動(dòng)態(tài)刷新實(shí)現(xiàn)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-09-09Java經(jīng)典面試題匯總:網(wǎng)絡(luò)編程
本篇總結(jié)的是Java 網(wǎng)絡(luò)編程相關(guān)的面試題,后續(xù)會(huì)持續(xù)更新,希望我的分享可以幫助到正在備戰(zhàn)面試的實(shí)習(xí)生或者已經(jīng)工作的同行,如果發(fā)現(xiàn)錯(cuò)誤還望大家多多包涵,不吝賜教,謝謝2021-07-07