歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 解密Java增強的泛型

解密Java增強的泛型

日期:2017/3/1 9:35:15   编辑:Linux編程

盡管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

Copyright © Linux教程網 All Rights Reserved