解密Java增強的泛型

jopen 9年前發布 | 5K 次閱讀 Java

盡管Java 8是2014年年初才發布的,而Java 9要等到2016年年中,但是目前有一些計劃放到某個未來版本(希望是Java 10)中的特性已經合并了進來。

具體而言,有兩個比較大的特性已經開始原型設計了,它們是增強的泛型(Enhanced Generics)和值類型(Value Types)。有了增強的泛型,Java開發者可以編寫像List<int>這樣的代碼,省去了對基本類型進行裝箱的痛苦。新的泛型提案有些 地方比較模糊(或者說微妙),需要細心處理,具體見Brian Goetz在最近的 設計文章 中的解釋。

Java一直在關注向后兼容,在Oracle的管理下,這一點也得到再次確認。為此,Oracle在尋求一種與Java 5中引入的泛型類似的策略,漸進地遷移。

需要克服的基本設計問題是,Java的類型系統沒有一個統一的根。Java中沒有這樣的類型,既是Object的子類,又是int的子類。從 JVM字節碼的結構也可以看出,很明顯從方法返回一個int和返回一個對象用的是不同的操作碼(opcode)——ireturn和areturn是不一 樣的。

目前的原型使用了一種叫做“any”類型變量的方式,用以指示既可以是引用類型,又可以是基本類型的類型變量(還包括新提議的值類型)。目前寫作Container<any T>,但是在該特性真正交付之前,語法還會改變。

目前的想法是,List<Integer>和List<String>在運行時將繼續使用List.class表示 (因此對于引用類型,將繼續存在類型擦除),List<int>則會用與之不同的運行時類型表示(可能會用不同的class文件)。這種方式 被稱作基本類型的“泛型特化”。此舉還可以給另一個設計問題帶來幫助,那就是升級現有的集合類,使用增強的泛型。支持開發者使用 List<int>是一個主要的設計目標,從現有的泛型類型,到未來版本中支持任何類型變量的泛型類型,應該可以遷移過去。

關于增強的泛型如何適應類型系統,還有些令人感覺奇怪的地方。比如,List<int>不是List類型的子類型(如果是的話,這 就意味著List<int>可以存儲Object的實例)。然而, List<?>是List的子類型,所以這意味著List<int>不是List<?>的子類型,通配符就無法應用 于增強的泛型。

目前的原型離真正產品化還差得遠,還有很多設計和實現工作要做。特化的實現正在積極進行。自動生成特化代碼更為可取(減少手工編寫樣板代碼),但這可能需 要在字節碼和類加載子系統中提供額外的支持。還有一個非常有趣的可能性,就是在虛擬機層面引入一個元編程設施(不是Java語言層面的直接支持)。用 invokedynamic 類比,這種方式可以稱為“classdynamic”,可以參見 這里 的描述。

增強的泛型和值類型的開發都是通過 Project Valhalla 管理的,更多細節可以參見該項目。

查看英文原文: Under The Hood With A Prototype of Enhanced Generics for Java

</div> 原文  http://www.infoq.com/cn/news/2014/12/Java10EnhancedGenerics

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!