91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java語法中泛型與類型擦除的示例分析

發布時間:2021-09-15 10:50:27 來源:億速云 閱讀:135 作者:小新 欄目:開發技術

這篇文章主要介紹Java語法中泛型與類型擦除的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

泛型與類型擦除

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

  • 接口

  • 方法

的創建中, 分別稱為:

  • 泛型類

  • 泛型接口

  • 泛型方法

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

  1. Object 是所有類型的父類

  2. 類型強制轉換

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

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

  • 泛型擦除前的例子

Java語法中泛型與類型擦除的示例分析

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

Java語法中泛型與類型擦除的示例分析

通過擦除實現泛型,喪失了一些泛型思想應有的優雅

  • 當泛型遇見重載1

Java語法中泛型與類型擦除的示例分析

不能被編譯的,因為參數List<Integer>List<String>編譯之后都被擦除了。變成了一樣的原生類型List<E>,擦除動作導致這兩種方法的特征簽名變得一模一樣。初步看來,無法重載的原因已經找到了,但真的就如此嗎? 只能說,泛型擦除成相同的原生類型只是無法重載的部分原因當

  • 泛型遇見置載2

Java語法中泛型與類型擦除的示例分析

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

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

  • 自動裝箱: 拆箱與遍歷循環

Java語法中泛型與類型擦除的示例分析

  • 自動裝箱: 拆箱與遍歷循環編譯后

Java語法中泛型與類型擦除的示例分析

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

Java語法中泛型與類型擦除的示例分析

以上是“Java語法中泛型與類型擦除的示例分析”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

扎兰屯市| 微山县| 山东省| 浦城县| 陆良县| 马关县| 文山县| 曲松县| 岳普湖县| 当雄县| 利辛县| 大安市| 临沧市| 绥滨县| 江华| 九龙城区| 宜阳县| 杂多县| 建平县| 鄂温| 府谷县| 克山县| 城口县| 石河子市| 饶河县| 土默特右旗| 民乐县| 烟台市| 万州区| SHOW| 昌吉市| 三江| 清丰县| 上杭县| 开鲁县| 原平市| 禄丰县| 禹城市| 尼玛县| 乐业县| 松阳县|