精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

用了這么多年的 Java 泛型,你對它到底有多了解?

新聞 前端
作為一個 Java 程序員,日常編程早就離不開泛型。泛型自從 JDK1.5 引進之后,真的非常提高生產力。

 [[327224]]

作為一個 Java 程序員,日常編程早就離不開泛型。泛型自從 JDK1.5 引進之后,真的非常提高生產力。一個簡單的泛型 T ,寥寥幾行代碼, 就可以讓我們在使用過程中動態替換成任何想要的類型,再也不用實現繁瑣的類型轉換方法。

雖然我們每天都在用,但是還有很多同學可能并不了解其中的實現原理。今天這篇我們從以下幾點聊聊 Java 泛型:

  • Java 泛型實現方式

  • 類型擦除帶來的缺陷

  • Java 泛型發展史

 

 

 

 

Java 泛型實現方式

Java 采用**類型擦除(Type erasure generics)**的方式實現泛型。用大白話講就是這個泛型只存在源碼中,編譯器將源碼編譯成字節碼之時,就會把泛型『 擦除 』,所以字節碼中并不存在泛型。

對于下面這段代碼,編譯之后,我們使用 javap -s class 查看字節碼。

 

 

方法源碼
字節碼

 

 

觀察 setParam 部分的字節碼,從 descriptor 可以看到,泛型 T 已被擦除,最終替換成了 Object 。

ps:并不是每一個泛型參數被擦除類型后都會變成 Object 類,如果泛型類型為  T extends String 這種方式,最終泛型擦除之后將會變成 String。

同理 getParam 方法,泛型返回值也被替換成了 Object 。

為了保證 String param = genericType.getParam(); 代碼的正確性,編譯器還得在這里插入類型轉換。

除此之外,編譯器還會對泛型安全性防御,如果我們往 ArrayList<String> 添加 Integer ,程序編譯期間就會報錯。

最終類型擦除后的代碼等同與如下:

 

 

 

 

類型擦除帶來的缺陷

作為對比,我們再來簡單聊下 C# 泛型的實現方式。

**C#**泛型實現方式為「 具現化式泛型(Reifiable generics) 」,不熟悉的 C# 小伙伴可以不用糾結 具現化 技術概念,我也不了解這些特性--!

簡單點來講,**C#**實現的泛型,無論是在程序源碼,還是在編譯之后的,甚至是運行期間都是切實存在的。

相對比與 C# 泛型,Java 泛型看起來就像是個「  」泛型。Java 泛型只存在程序源碼中,編譯之后就被擦除,這種缺陷相應的會帶來一些問題。

不支持基本數據類型

泛型參數被擦除之后,強制變成了 Object 類型。這么做對于引用類型來說沒有什么問題,畢竟 Object 是所有類型的父類型。但是對于 int/long 等八個基本數據類型說,這就難辦了。因為 Java 沒辦法做到 int/long 與 Object 的強制轉換。

如果要實現這種轉換,需要進行一系列改造,改動難度還不小。所以當時 Java 給出一個簡單粗暴的解決方案:既然沒辦法做到轉換,那就索性不支持原始類型泛型了。

如果需要使用,那就規定使用相關包裝類的泛型,比如 ArrayList<Integer> 。另外為了開發人員方便,順便增加了原生數據類型的 自動拆箱/裝箱 的特性。

正是這種「偷懶」的做法,導致現在我們沒辦法使用原始類型泛型,又要忍受包裝類裝箱/拆箱帶來的開銷,從而又帶來運行效率的問題。

運行效率

上面字節碼例子我們已經看到,泛型擦除之后類型將會變成 Object 。當泛型出現在方法輸入位置的時候,由于 Java 是可以向上轉型的,這里并不需要強制類型轉換,所以沒有什么問題。

但是當泛型參數出現在方法的輸出位置(返回值)的時候,調用該方法的地方就需要進行向下轉換,將 Object 強制轉換成所需類型,所以編譯器會插入一句 checkcast 字節碼。

除了這個,上面我們還說到原始基本數據類型,編譯器還需幫助我們進行裝箱/拆箱。

所以對于下面這段代碼來說:

  1. List<Integer> list = new ArrayList<Integer>(); 
  2. list.add(66); // 1 
  3. int num = list.get(0); // 2 

對于①處,編譯器要做就是增加基本類型的裝箱即可。但是對于第二步來說,編譯器首先需要將 Object 強制轉換成 Integer ,接著編譯器還需要進行拆箱。

類型擦除之后,上面代碼等同于:

  1. List list = new ArrayList(); 
  2. list.add(Integer.valueOf(66)); 
  3. int num = ((Integer) list.get(0)).intValue(); 

如果上面泛型代碼在 C# 實現,就不會有這么多額外步驟。所以 Java 這種類型擦除式泛型實現方式無論使用效果與運行效率,還是全面落后于 C# 的具現化式泛型。

運行期間無法獲取泛型實際類型

由于編譯之后,泛型就被擦除,所以在代碼運行期間,Java 虛擬機無法獲取泛型的實際類型。

下面這段代碼,從源碼上兩個 List 看起來是不同類型的集合,但是經過泛型擦除之后,集合都變為 ArrayList 。所以 if 語句中代碼將會被執行。

  1. ArrayList<Integer> li = new ArrayList<Integer>(); 
  2. ArrayList<Float> lf = new ArrayList<Float>(); 
  3. if (li.getClass() == lf.getClass()) { // 泛型擦除,兩個 List 類型是一樣的 
  4.     System.out.println("6666"); 

這樣代碼看起來就有點反直覺,這對新手來說不是很友好。

另外還會給我們在實際使用中帶來一些限制,比如說我們沒辦法直接實現以下代碼:

 

 

 

 

最后再舉個例子,比如說我們需要實現一個泛型 List 轉換成數組的方法,我們就沒辦法直接從 List 去獲取泛型實際類型,所以我們不得不額外再傳入一個 Class 類型,指定數組的類型:

  1. public static <E> E[] convert(List<E> list, Class<E> componentType) { 
  2.     E[] array = (E[]) Array.newInstance(componentType, list.size()); 
  3.     .... 

從上面的例子我們可以看到,Java 采用類型擦除式實現泛型,缺陷很多。那為什么 Java 不采用 C# 的那種泛型實現方式?或者說采用一種更好實現方式?

這個問題等我們了解 Java 泛型機制的歷史,以及當時 Java 語言的現狀,我們才能切身體會到當時 Java 采用這種泛型實現方式的原因。

Java 泛型歷史背景

Java 泛型最早是在 JDK5 的時候才被引入,但是泛型思想最早來自來自 C++ 模板(template)。1996 年 Martin Odersky(Scala 語言締造者) 在剛發布的 Java 的基礎上擴展了泛型、函數式編程等功能,形成一門新的語言-「 Pizza 」。

后來,Java 核心開發團隊對 Pizza 的泛型設計深感興趣,與 Martin 合作,一起合作開發的一個新的項目「 Generic Java 」。這個項目的目的是為了給 Java 增加泛型支持,但是不引入函數式編程等功能。最終成功在 Java5 中正式引入泛型支持。

 

 

 

 

泛型移植過程,一開始并不是朝著類型擦除的方向前進,事實 Pizza 中泛型更加類似于 C# 中的泛型。

但是由于 Java 自身特性,自帶嚴格的約束,讓 Martin 在 Generic Java 開發過程中,不得不放棄了 Pizza 中泛型設計。

這個特性就是,Java 需要做到 嚴格的向后兼容性 。也就是說一個在 JDK1.2 編譯出來 Class 文件,不僅能在 JDK 1.2 能正常運行,還得必須保證在后續 JDK,比如 JDK12 中也能保證正常的運行。

這種特性是明確寫入 Java 語言規范的,這是一個對 Java 使用者的一個嚴肅承諾。

這里強調一下,這里的向后兼容性指的是二進制兼容性,并不是源碼兼容性。也不保證高版本的 Class 文件能夠運行在低版本的 JDK 上。

現在困難點在于,Java 1.4.2 之前都沒有支持泛型,而 Java5 之后突然要支持泛型,還要讓 JDK1.4 之前編譯的程序能在新版本中正常運行,這就意味著以前沒有的限制,就不能突然增加。

舉個例子:

  1. ArrayList arrayList=new ArrayList(); 
  2. arrayList.add("6666"); 
  3. arrayList.add(Integer.valueOf(666)); 

沒有泛型之前, List 集合是可以存儲不同類型的數據,那么引入泛型之后,這段代碼必須的能正確運行。

為了保證這些舊的 Clas 文件能在 Java5 之后正常運行,設計者基本有兩條路:

  1. 需要泛型化的容器(主要是容器類型),以前有的保持不變,平行增加一套新的泛型化的版本。

  2. 直接把已有的類型原地泛型化,不增加任何新的已有類型的泛型版本。

如果 Java 采用第一條路實現方式,那么現在我們可能就會有兩套集合類型。以 ArrayList 為例,一套為普通的 java.util.ArrayList ,一套可能為 java.util.generic.ArrayList<T> 。

采用這種方案之后,如果開發中需要使用泛型特性,那么直接使用新的類型。另外舊的代碼不改動,也可以直接運行在新版本 JDK 中。

這套方案看起來沒什么問題,實際上C# 就是采用這套方案。但是為什么 Java  卻沒有使用這套方案那?

這是因為當時 C# 才發布兩年,歷史代碼并不多,如果舊代碼需要使用泛型特性,改造起來也很快。但是 Java 不一樣,當時 Java 已經發布十年了,已經有很多程序已經運行部署在生產環境,可以想象歷史代碼非常多。

如果這些應用在新版本 Java 需要使用泛型,那就需要做大量源碼改動,可以想象這個開發工作量。

另外 Java 5   之前,其實我們就已經有了兩套集合容器,一套為 Vector/Hashtable 等容器,一套為 ArrayList/ HashMap 。這兩套容器的存在,其實已經引來一些不便,對于新接觸的 Java 的開發人員來說,還得學習這兩者的區別。

如果此時為了泛型再引入新類型,那么就會有四套容器同時并存。想想這個畫面,一個新接觸開發人員,面對四套容器,完全不知道如何下手選擇。如何 Java 真的這么實現了,想必會有更多人吐槽 Java。

所以 Java 選擇第二條路,采用類型擦除,只需要改動 Javac 編譯器,不需要改動字節碼,不需要改動虛擬機,也保證了之前歷史沒有泛型的代碼還可以在新的 JDK 中運行。

但是第二條路,并不代表一定需要使用類型擦除實現,如果有足夠時間好好設計,也許會有更好的方案。

當年留下的技術債,現在只能靠 Valhalla 項目來還了。這個項目從2014 年開始立項,原本計劃在 JDK10 中解決現有語言的各種缺陷。但是結果我們也知道了,現在都 JDK14 了,還只是完成少部分目標,并沒有解決核心目標,可見這個改動的難度啊。

總結

本文我們先從 Java 泛型底層實現方式開始聊起,接著舉了幾個例子,讓大家了解現在泛型實現方式存在一些缺陷。

然后我們帶入 Java 泛型歷史背景,站在 Java 核心開發者的角度,才能了解 Java 泛型這么現實無奈原因。

最后作為 Java 開發者,讓我們對于現在  Java 一些不足,少些抱怨,多一些理解吧。相信之后 Java 核心開發人員肯定會解決泛型現有的缺陷,讓我們拭目以待。

 

 

責任編輯:張燕妮 來源: 程序通事
相關推薦

2023-09-28 11:45:09

泛型類對象編譯器

2020-05-29 14:18:12

Java泛型數據

2023-11-13 08:49:54

2018-10-06 21:51:37

代碼SOLID編程

2018-10-07 06:30:40

代碼設計模式面向對象原則

2013-07-09 09:55:33

科技年齡半導體

2022-12-26 07:43:44

SpringBootWeb 類框架的

2015-03-27 10:20:41

谷歌地圖谷歌偉大

2021-10-07 23:24:21

手機關機重啟

2024-02-20 08:09:51

Java 8DateUtilsDate工具類

2018-08-28 16:10:36

2020-07-21 18:37:14

代碼條件變量

2019-12-06 14:50:49

APP錄音隱私

2021-04-16 11:15:22

蘋果手機屏幕

2017-11-30 07:30:27

程序員代碼軟件世界觀

2021-09-11 22:56:58

微信功能技巧

2021-09-03 00:31:17

iPhone手機截圖

2021-09-06 11:39:39

筆記本噪音風扇

2021-09-21 16:18:07

手機電池快充

2025-08-01 00:00:00

點贊
收藏

51CTO技術棧公眾號

亚洲成人激情在线观看| 国产精品99久久久久久久女警| 亚洲成人久久电影| 国产乱子夫妻xx黑人xyx真爽| 三级av在线| 日韩二区三区四区| 久久99视频免费| 精品国产av无码| 久久精品一级| 色先锋aa成人| 黄网站色视频免费观看| 精品亚洲综合| 国产精品一区二区在线播放| 欧美专区第一页| 免费人成在线观看| 6080成人| 先锋亚洲精品| 久久精品国产成人| 久久久久国产精品无码免费看| 日韩电影免费观看高清完整版| 一区在线播放视频| 免费不卡亚洲欧美| 丁香六月天婷婷| 久久国产麻豆精品| 7777免费精品视频| 中文字幕亚洲欧美日韩| 国内精品伊人久久久| 日韩欧美亚洲国产另类| 男操女免费网站| 中文不卡1区2区3区| 一区二区视频在线| 中文字幕不卡每日更新1区2区| 日韩欧美电影在线观看| 国产一区二区三区av电影| 国产成人涩涩涩视频在线观看 | 中文一区一区三区高中清不卡| 91精品视频网站| 久久久久久久久久一级| 国产亚洲亚洲| 国内免费久久久久久久久久久| 国产乱子轮xxx农村| 国产一区二区三区探花| 亚洲欧美在线免费| 97人妻精品一区二区三区免 | 欧美黑人猛猛猛| 99久久99久久精品国产片果冰| 亚洲视频在线观看网站| 欧美做受喷浆在线观看| 欧美日韩一区二区三区四区不卡 | 亚洲日本欧美| 欧美极品xxxx| 精品无码m3u8在线观看| 欧美一区不卡| 欧美精品在线观看| 欧美精品xxxxx| 国产精品99一区二区| 久久久99免费视频| 国产精品久久久久久久精| 91精品国产自产拍在线观看蜜| 日韩一区二区久久久| 特级西西人体高清大胆| 久久成人综合| 久久综合色88| 国产亚洲第一页| 亚洲区国产区| 国产成人综合av| 国产99免费视频| 强制捆绑调教一区二区| 国产日韩换脸av一区在线观看| 亚洲熟妇av乱码在线观看| 久久99国内精品| 91精品天堂| 日本激情一区二区| 久久亚洲欧美国产精品乐播| 日本在线观看一区二区| 日本a在线播放| 一区av在线播放| av动漫在线看| 国产成人免费精品| 精品久久久久一区二区国产| av网站有哪些| 9999国产精品| 久久免费精品视频| 日韩免费av网站| 狠狠狠色丁香婷婷综合久久五月| av电影成人| 日韩精品一二| 亚洲你懂的在线视频| 99re8这里只有精品| www.超碰在线| 欧美精品久久99久久在免费线 | 亚洲成熟女性毛茸茸| 91免费看片在线观看| 亚洲精品国产一区| 免费在线国产视频| 91国产免费观看| 特黄特黄一级片| 一区三区在线欧| 久久影院在线观看| 天码人妻一区二区三区在线看| 久久国产精品99久久久久久老狼 | 成人免费高清在线播放| 一区二区三区精品在线| 国产v亚洲v天堂无码久久久| 精品一区二区三区视频在线播放| 日韩精品视频在线播放| 久久久久亚洲av片无码| 新狼窝色av性久久久久久| 成人黄色免费网站在线观看| 无码精品黑人一区二区三区| 国产欧美视频一区二区| www..com日韩| 高清一区二区| 国产亚洲一级高清| 日韩精品成人在线| 国产伦精品一区二区三区免费| 欧洲一区二区在线| 97超碰在线免费| 91精品国产综合久久福利软件 | 精品国产一区二区三区噜噜噜| 久精品免费视频| 亚洲手机在线观看| 国产婷婷色一区二区三区四区| 黑人巨大国产9丨视频| 91亚洲欧美激情| xf在线a精品一区二区视频网站| av磁力番号网| 国产91在线播放精品| 亚洲欧美国产日韩天堂区| 免费无码毛片一区二区app| 免费成人在线观看视频| 懂色av蜜臀av粉嫩av永久| youjizz在线视频| 精品写真视频在线观看| 热re99久久精品国产99热| 久久香蕉av| 欧美一区二区三区婷婷月色| 午夜精产品一区二区在线观看的| 中文字幕无码精品亚洲35| 国产乱码久久久| 久久影院视频免费| 国产乱子伦精品无码专区| 精品久久久网| 一区二区三区国产视频| 亚洲综合久久网| 国产伊人久久| 欧美精品一区二区三区视频| 日本青青草视频| 国产一区二区看久久| 波多野结衣三级在线| 99综合久久| 久久久精品免费| 99热这里只有精品1| 一区二区在线观看视频| 亚洲色图欧美另类| 精品动漫3d一区二区三区免费| 高清av免费一区中文字幕| 欧美精品videossex少妇| 日韩免费高清av| 日韩激情一区二区三区| a级高清视频欧美日韩| 国产伦精品一区二区三区四区视频_| 国产精品对白久久久久粗| 韩剧1988在线观看免费完整版| 天堂中文在线看| 色综合久久99| 精品在线观看一区| 国产精品自拍在线| 91成人在线观看喷潮教学| 日韩av资源网| 国产国语videosex另类| 在线看的av网站| 日韩精品影音先锋| 美日韩一二三区| 亚洲国产精品二十页| 亚洲在线观看网站| 野花国产精品入口| 日韩久久久久久久| 国产区一区二| 欧美一级片一区| 日本在线免费| 精品国产伦一区二区三区免费| 国产精品人人人人| 国产精品欧美一级免费| 在线观看一区二区三区四区| 久久久亚洲一区| 看一级黄色录像| 在线日韩一区| 99热在线播放| 欧美gay视频| 欧美猛少妇色xxxxx| 天天操天天爱天天干| 欧美色视频在线观看| 国产一级视频在线观看| 日本一区二区高清| 黄色激情在线观看| 奇米四色…亚洲| 国产素人在线观看| 99久久亚洲精品蜜臀| 国产一区精品视频| www.久久久久爱免| 国产成人精品a视频一区www| 91精选在线| 永久免费精品影视网站| 日本精品一二区| 制服丝袜亚洲色图| 香蕉污视频在线观看| 亚洲午夜电影在线观看| 激情高潮到大叫狂喷水| 国产午夜亚洲精品午夜鲁丝片| 丰满少妇xbxb毛片日本| 麻豆精品在线播放| 欧美xxxxx在线视频| 国语精品一区| 91嫩草国产丨精品入口麻豆| 国内精品伊人久久久| 久久亚洲一区二区| 成人性生交大片免费看96| 成人性生交xxxxx网站| 免费观看成人性生生活片| 97香蕉超级碰碰久久免费软件| caoporm免费视频在线| 中文字幕视频在线免费欧美日韩综合在线看 | 亚洲经典一区二区三区| 欧美日高清视频| 国产情侣免费视频| 欧美日韩视频免费播放| 日本三级网站在线观看| 一区二区三区美女视频| 小泽玛利亚一区| 国产精品久久免费看| 亚洲一区二区自偷自拍 | av资源网在线播放| 九九久久久久久久久激情| 免费观看在线午夜影视| 中文字幕综合在线| 国产粉嫩一区二区三区在线观看| 精品伊人久久97| 日产精品久久久久久久性色| 日韩av网址在线| 日夜干在线视频| 亚洲人精品午夜在线观看| 青青久在线视频免费观看| 亚洲精品mp4| 亚洲 另类 春色 国产| 亚洲电影免费观看| 天天舔天天干天天操| 亚洲国产日韩欧美在线动漫| 日日夜夜精品免费| 日韩电视剧免费观看网站| 天堂中文在线看| 精品无码久久久久久国产| 麻豆app在线观看| 亚洲人成网站777色婷婷| 3d成人动漫在线| 日韩在线播放av| 在线中文字幕电影| 久久久久久午夜| 一个人看的www视频在线免费观看 一个人www视频在线免费观看 | 国产精品日韩一区二区三区 | 日本一二三区视频在线| 午夜视频精品| 欧美不卡在线播放| 久久亚洲视频| 午夜国产福利在线观看| 国产剧情一区在线| 国产精品无码网站| 国产精品午夜春色av| 小泽玛利亚一区二区免费| 一区二区三区在线影院| 国产精品免费av一区二区| 日韩欧美福利视频| 中文字幕福利视频| 日韩欧美色电影| 四虎在线免费看| 中文字幕精品av| 丁香花视频在线观看| 日本久久亚洲电影| 大胆国模一区二区三区| 激情视频一区二区| 成人3d精品动漫精品一二三| 警花观音坐莲激情销魂小说| 99成人在线| 国内外成人免费在线视频| 丁香婷婷综合激情五月色| 自拍偷拍视频亚洲| 一区二区三区波多野结衣在线观看 | 国产欧美一区| 久久久久久久香蕉| 青青草国产精品97视觉盛宴| 日本一区二区在线观看视频| 久久久国产午夜精品| 欧美日韩一级大片| 91久久香蕉国产日韩欧美9色| 国产日韩精品suv| 亚洲欧美日韩国产中文| a级影片在线观看| 国产福利成人在线| 久久精品论坛| 91九色国产ts另类人妖| 日韩精品一二区| 国产免费一区二区三区最新6| 国产精品欧美久久久久无广告 | 欧美一三区三区四区免费在线看| 深夜福利视频在线观看| 美女av一区二区三区| 高清av一区| 欧美久久久久久| 亚洲人成高清| 国产欧美视频一区| 中文字幕在线免费不卡| 亚洲欧美偷拍视频| 欧美va亚洲va| 2024短剧网剧在线观看| 国产精品久久久久久久美男| 久久悠悠精品综合网| 男女裸体影院高潮| 另类小说欧美激情| av男人的天堂av| 第一福利永久视频精品| 丰满少妇高潮在线观看| 欧美成aaa人片免费看| 国内精品伊人| 四虎影视永久免费在线观看一区二区三区 | 免费观看亚洲天堂| 亚洲综合首页| 免费人成黄页网站在线一区二区| 五级黄高潮片90分钟视频| 亚洲福中文字幕伊人影院| 国产肥老妇视频| 欧美超级免费视 在线| 电影91久久久| 日韩video| 国产精品一区二区三区网站| 91视频青青草| 91精品婷婷国产综合久久 | 国产欧美一区二区三区精品观看| 啊啊啊一区二区| 91理论电影在线观看| 久久黄色精品视频| 亚洲精品一区中文字幕乱码| 日韩欧美一中文字暮专区| 久久综合给合久久狠狠色| 亚洲影院一区| 国产精品揄拍100视频| 日韩欧美亚洲范冰冰与中字| 精品av中文字幕在线毛片| 日韩免费在线观看视频| 韩日一区二区三区| 九九热免费在线观看| 成人免费视频在线观看| 国产男男gay网站| 九九热精品在线| 视频在线亚洲| 国产妇女馒头高清泬20p多| 91网站在线播放| 最新中文字幕免费| 精品久久久av| 麻豆视频久久| 日本福利视频一区| 91麻豆视频网站| 中文精品久久久久人妻不卡| 中文字幕在线看视频国产欧美在线看完整 | 污污污www精品国产网站| 欧美午夜激情在线| 91se在线| 超碰97网站| 先锋亚洲精品| 色哟哟一一国产精品| 欧美大肚乱孕交hd孕妇| 神马久久午夜| 亚洲一区二区三区精品在线观看 | 99在线国产| 一本久道综合久久精品| 欧美激情aaa| 51精品秘密在线观看| av日韩国产| 图片区小说区区亚洲五月| 国产老妇另类xxxxx| 久久中文字幕免费| 精品国产一区二区三区四区在线观看| 一区二区三区免费在线看| 激情综合网婷婷| 亚洲日本在线观看| 欧美美女色图| 亚洲一区久久久| 久久精品国产清高在天天线| 久艹在线观看视频| 日韩成人在线电影网| 成人在线视频区| 亚洲精品一二三四五区| 一级精品视频在线观看宜春院 | 亚洲3p在线观看| 91日韩在线| 亚洲自拍偷拍一区二区| 欧美一二三四区在线| www成人在线视频| 2018国产在线| 亚洲视频在线观看三级| 你懂得在线网址|