最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java語法關(guān)于泛型與類型擦除的分析

 更新時間:2021年09月15日 09:29:41   作者:JavaEdge.  
泛型沒有其看起來那么深不可測,它并不神秘與神奇,泛型是Java 中一個很小巧的概念,但同時也是一個很容易讓人迷惑的知識點(diǎn),它讓人迷惑的地方在于它的許多表現(xiàn)有點(diǎn)違反直覺

泛型與類型擦除

泛型,JDK 1.5新特性,本質(zhì)是參數(shù)化類型(Parametersized Type) 的應(yīng)用,即所操作的數(shù)據(jù)類型被指定為一個參數(shù)。這種參數(shù)類型可用在:

  • 接口
  • 方法

的創(chuàng)建中, 分別稱為:

  • 泛型類
  • 泛型接口
  • 泛型方法

在Java還沒有泛型的版本時。只能通過:

  1. Object 是所有類型的父類
  2. 類型強(qiáng)制轉(zhuǎn)換

兩個特性協(xié)作實(shí)現(xiàn)類型泛化。例如,在哈希表的存取中,JDK 1.5之前使用HashMap的get() 方法,返回值就是個Object。由于Java語言里面所有的類型都維承于java.lang.Object,所以O(shè)bject轉(zhuǎn)型成任何對象都有可能。但也因?yàn)橛袩o限的可能性,就只有程序員和運(yùn)行期的虛擬機(jī)才知道這個Objet到底是個什么類型的對象。
編譯期間,編譯器無法檢查該Object的強(qiáng)制轉(zhuǎn)型是否成功。若僅僅依賴程序員去保障正確性,許多ClassCastException的風(fēng)險就會延遲到程序運(yùn)行期。

Java語言中的泛型則不一樣,它只在程序源碼中存在,在編譯后的字節(jié)碼文件中,就已經(jīng)替換為原來的原生類型(Raw Type) ,并在相應(yīng)地方插入強(qiáng)制轉(zhuǎn)換代碼。
因此,對運(yùn)行期的Java來說Araylist<int>Aralist<String>是同一個類。所以泛型是Java語言的一顆語法糖Java稱為類型擦除,基于這種方法實(shí)現(xiàn)的泛型稱為偽泛型。

  • 泛型擦除前的例子

把這段Java代碼編譯成Class文件,然后再用字節(jié)碼反編譯后,將會發(fā)現(xiàn)泛型都不見了,又變回了Java泛型出現(xiàn)之前的寫法,泛型類型都變回了原類型。如:

通過擦除實(shí)現(xiàn)泛型,喪失了一些泛型思想應(yīng)有的優(yōu)雅

  • 當(dāng)泛型遇見重載1

不能被編譯的,因?yàn)閰?shù)List<Integer>List<String>編譯之后都被擦除了。變成了一樣的原生類型List<E>,擦除動作導(dǎo)致這兩種方法的特征簽名變得一模一樣。初步看來,無法重載的原因已經(jīng)找到了,但真的就如此嗎? 只能說,泛型擦除成相同的原生類型只是無法重載的部分原因當(dāng)

  • 泛型遇見置載2

由于Java泛型的引入,各種場景(虛擬機(jī)解析、反射等)下的方法調(diào)用都可能對原有基礎(chǔ)產(chǎn)生影響,如在泛型類中如何獲取傳入的參數(shù)化類型等。因此,JCP組織對虛擬機(jī)規(guī)范做出了相應(yīng)的修改,引入了諸如Signature、LocalVariableTypeTable 等新的屬性用于解決伴隨泛型而來的參數(shù)類型的識別問題,Signature 是其中最重要的一項(xiàng)屬性,它的作用就是存儲一個方法在字節(jié)碼層面的特征簽名,這個屬性中保存的參數(shù)類型并不是原生類型,而是包括了參數(shù)化類型的信息。修改后的虛擬機(jī)規(guī)范要求所有能識別49.0以上版本的Class文件的虛擬機(jī)都要能正確地識別Signature參數(shù)。

從Signature屬性的出現(xiàn)我們還可以得出結(jié)論,所謂的擦除,僅僅是對方法的Code屬性中的字節(jié)碼進(jìn)行擦除,實(shí)際上元數(shù)據(jù)還是保留了泛型信息,這也是我們能通過反射取得參數(shù)化類型的根本依據(jù)。

  • 自動裝箱: 拆箱與遍歷循環(huán)

  • 自動裝箱: 拆箱與遍歷循環(huán)編譯后

遍歷循環(huán)則把代碼還原成了迭代器的實(shí)現(xiàn),這也是為何遍歷循環(huán)需要被遍歷的類實(shí)現(xiàn)Iterable接口的原因。最后再看看變長參數(shù),它在調(diào)用的時候變成了一個數(shù)組類型的參數(shù),在變長參數(shù)出現(xiàn)之前,程序員就是使用數(shù)組來完成類似功能的。

到此這篇關(guān)于Java語法關(guān)于泛型與類型擦除的分析的文章就介紹到這了,更多相關(guān)Java 泛型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中優(yōu)先隊(duì)列PriorityQueue常用方法示例

    Java中優(yōu)先隊(duì)列PriorityQueue常用方法示例

    這篇文章主要介紹了Java中優(yōu)先隊(duì)列PriorityQueue常用方法示例,PriorityQueue是一種特殊的隊(duì)列,滿足隊(duì)列的“隊(duì)尾進(jìn)、隊(duì)頭出”條件,但是每次插入或刪除元素后,都對隊(duì)列進(jìn)行調(diào)整,使得隊(duì)列始終構(gòu)成最小堆(或最大堆),需要的朋友可以參考下
    2023-09-09
  • 詳解Java中的Lambda表達(dá)式

    詳解Java中的Lambda表達(dá)式

    Lambda表達(dá)式是Java SE 8中一個重要的新特性。這篇文章主要介紹了Java中的Lambda表達(dá)式 ,需要的朋友可以參考下
    2019-04-04
  • springboot配置嵌入式servlet容器的方法

    springboot配置嵌入式servlet容器的方法

    這篇文章主要介紹了springboot配置嵌入式servlet容器的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Java實(shí)現(xiàn)FTP批量大文件上傳下載篇2

    Java實(shí)現(xiàn)FTP批量大文件上傳下載篇2

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)FTP批量大文件上傳下載的強(qiáng)化篇,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-08-08
  • Springboot分頁插件使用實(shí)例解析

    Springboot分頁插件使用實(shí)例解析

    這篇文章主要介紹了Springboot分頁插件使用實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11
  • 深入講解我們說的CAS自旋鎖到底是什么

    深入講解我們說的CAS自旋鎖到底是什么

    這篇文章主要給大家介紹了關(guān)于我們說的CAS自旋鎖到底是什么的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-05-05
  • ant打包jar文件腳本分享

    ant打包jar文件腳本分享

    本文介紹的ant腳本是用來打包jar文件,做完JAVA應(yīng)用一定會用到這個,需要的朋友可以參考下
    2014-03-03
  • Mybatis如何實(shí)現(xiàn)InsertOrUpdate功能

    Mybatis如何實(shí)現(xiàn)InsertOrUpdate功能

    這篇文章主要介紹了Mybatis如何實(shí)現(xiàn)InsertOrUpdate功能,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Java Lombok簡介、使用、工作原理、優(yōu)缺點(diǎn)

    Java Lombok簡介、使用、工作原理、優(yōu)缺點(diǎn)

    這篇文章主要介紹了Java Lombok簡介、使用、工作原理、優(yōu)缺點(diǎn)的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用Java Lombok,感興趣的朋友可以了解下
    2021-03-03
  • java split結(jié)果去除空字符串的方法實(shí)現(xiàn)

    java split結(jié)果去除空字符串的方法實(shí)現(xiàn)

    在Java開發(fā)中,我們經(jīng)常需要對字符串進(jìn)行分割操作,本文主要介紹了java split結(jié)果去除空字符串的方法實(shí)現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2023-10-10

最新評論

南陵县| 莫力| 宣化县| 弋阳县| 高青县| 靖江市| 酉阳| 叙永县| 马尔康县| 平阴县| 竹北市| 桂林市| 鹤庆县| 阳春市| 柞水县| 沛县| 凤翔县| 安平县| 安阳市| 嵊泗县| 蓬溪县| 长治县| 天水市| 桦甸市| 威宁| 特克斯县| 临洮县| 峨山| 灵武市| 黎平县| 高陵县| 剑河县| 屯留县| 措勤县| 个旧市| 雷州市| 湟中县| 铜鼓县| 马公市| 芦山县| 墨江|