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

破案了!關(guān)于 Java 泛型擦除的那些破事

開發(fā) 后端
在淺層的意識上,我們會認為 ArrayList list 和 ArrayList list 是兩種不同的類型,因為 String 和 Date 是兩個不同的類。

[[413990]]

 大家好,我是“福爾摩斯”上身的二哥呀!

由于最近經(jīng)常在知乎上回答問題,所以吳某和都某的瓜我第一時間就吃了。我心想,這次XX徹底涼涼了呀,沒想到最后警方通報是一期金錢詐騙案,我當(dāng)時就炸了!

我去,還帶這種操作呀!

這件事給二哥造成了極壞的后遺癥,以至于我滿腦子都是破案、破案、破案,一直到現(xiàn)在,還沒有徹底消退。

這不,有讀者在《教妹學(xué)Java》專欄的第 46 講:泛型里提了這樣一個問題:關(guān)于類型擦除的。

我當(dāng)時就決定了:我一定要破這個案!Java 泛型表面一套背后一套的作法實在是太可惡了。

害,為了讓大家學(xué)點真正的技術(shù),二哥也是費盡心思啊。

簡單來回顧一下類型擦除,看下面這段代碼。

  1. public class Cmower { 
  2.     public static void method(ArrayList<String> list) { 
  3.         System.out.println("Arraylist<String> list"); 
  4.     } 
  5.  
  6.     public static void method(ArrayList<Date> list) { 
  7.         System.out.println("Arraylist<Date> list"); 
  8.     } 

在淺層的意識上,我們會認為 ArrayList list 和 ArrayList list 是兩種不同的類型,因為 String 和 Date 是兩個不同的類。

但由于類型擦除的原因,以上代碼是不會編譯通過的——編譯器會提示一個錯誤:

'method(ArrayList)' clashes with 'method(ArrayList)'; both methods have same erasure

意思就是說,兩個 method() 方法經(jīng)過類型擦除后的方法簽名是完全相同的,Java 是不允許這樣做的。

按照我們的假設(shè):如果 Java 能夠?qū)崿F(xiàn)真正意義上的泛型,兩個 method() 方法是可以同時存在的,就好像方法重載一樣。

  1. public class Cmower { 
  2.     public static void method(String list) { 
  3.     } 
  4.  
  5.     public static void method(Date list) { 
  6.     } 

為什么 Java 不能實現(xiàn)真正意義上的泛型呢?背后的原因是什么?

第一,兼容性

Java 在 2004 年已經(jīng)積累了較為豐富的生態(tài),如果把現(xiàn)有的類修改為泛型類,需要讓所有的用戶重新修改源代碼并且編譯,這就會導(dǎo)致 Java 1.4 之前打下的江山可能會完全覆滅。

想象一下,你的代碼原來運行的好好的,就因為 JDK 的升級,導(dǎo)致所有的源代碼都無法編譯通過并且無法運行,是不是會非常痛苦?從此再也不愛 Java 了呢?

類型擦除就完美實現(xiàn)了兼容性,Java 1.5 之后的類可以使用泛型,而 Java 1.4 之前沒有使用泛型的類也可以保留,并且不用做任何修改就能在新版本的 Java 虛擬機上運行。

老用戶不受影響,新用戶可以自由地選擇使用泛型,可謂一舉兩得。

第二,不是“實現(xiàn)不了真正的泛型”

Pizza,1996 年的實驗語言,在 Java 的基礎(chǔ)上擴展了泛型。

Pizza 教程地址:http://pizzacompiler.sourceforge.net/doc/tutorial.html

這里插一下 Java 的版本歷史,大家好有一個時間線上的觀念。

  • 1995年5月23日,Java語言誕生
  • 1996年1月,JDK1.0 誕生
  • 1997年2月18日,JDK1.1發(fā)布
  • 1998年2月,JDK1.1被下載超過2,000,000次
  • 2000年5月8日,JDK1.3發(fā)布
  • 2000年5月29日,JDK1.4發(fā)布
  • 2004年9月30日18:00 PM,J2SE1.5 發(fā)布

也就是說,Pizza 在 JDK 1.0 的版本上就實現(xiàn)了“真正意義上的”泛型,我引過來兩段例子,大家一看就明白了。

首先是 StoreSomething,一個泛型類,標(biāo)識符是大寫字母 A 而不是我們熟悉的大寫字母 T。

  1. class StoreSomething<A> { 
  2.      A something; 
  3.  
  4.      StoreSomething(A something) { 
  5.          this.something = something; 
  6.      } 
  7.  
  8.      void set(A something) { 
  9.          this.something = something; 
  10.      } 
  11.  
  12.      A get() { 
  13.          return something; 
  14.      } 

 

這個 A 呢,可以是任何合法的 Java 類型(比如說 String 和 int):

  1. StoreSomething<String> a = new StoreSomething("I'm a string!"); 
  2. StoreSomething<int> b = new StoreSomething(17+4); 
  3.  
  4. b.set(9); 
  5.  
  6. int i = b.get(); 
  7. String s = a.get(); 

認真看一下這段代碼,大家就會發(fā)現(xiàn),這就是我們想要的“真正意義上的泛型”啊!A 不僅僅可以是引用類型 String,還可以是基本數(shù)據(jù)類型 int。要知道,Java 1.5 實現(xiàn)的泛型不允許是基本數(shù)據(jù)類型,只能是包裝器類型(比如說 Integer)。

 

除此之外,Pizza 的泛型還可以直接使用 new 關(guān)鍵字進行聲明,并且 Pizza 編譯器會從構(gòu)造方法的參數(shù)上推斷出具體的對象類型,究竟是 String 還是 int。要知道,Java 的泛型因為類型擦除的原因,我們開發(fā)人員是無法知道一個 ArrayList 究竟是 ArrayList 還是 ArrayList 的。

  1. ArrayList<Integer> ints = new ArrayList<Integer>(); 
  2. ArrayList<String> strs = new ArrayList<String>(); 
  3.  
  4. System.out.println(ints.getClass()); 
  5. System.out.println(strs.getClass()); 

輸出結(jié)果:

  1. class java.util.ArrayList 
  2. class java.util.ArrayList 

都是 ArrayList 而已。

那 Pizza 這種“真正意義上的泛型”為什么沒有被 Java 采納呢?想必這是大家都很關(guān)心的問題。

事實上,Java 的核心開發(fā)組對 Pizza 的泛型設(shè)計非常感興趣,并且與 Pizza 的設(shè)計者 Martin 和 Phil 取得了聯(lián)系,新合作了一個項目 Generic Java,爭取在 Java 中添加泛型支持,但不引入 Pizza 的其他功能,比如說函數(shù)式編程。

這里再補充一點維基百科上的資料,Martin Odersky 是一名德國計算機科學(xué)家,他和其他人一起設(shè)計了 Scala 編程語言,以及 Generic Java(還有之前的 Pizza),他實現(xiàn)的 Generic Java 編譯器成為了 Java 編譯器 javac 的基礎(chǔ)。

站在馬后炮的思維來看,Pizza 的泛型設(shè)計和函數(shù)式編程非常具有歷史前瞻性。然而 Java 的核心開發(fā)組在當(dāng)時似乎并不想把函數(shù)式編程引入到 Java 中。

以至于 Java 在 1.4 之前仍然是不支持泛型的,為什么 Java 1.5 的時候又突然支持泛型了呢?

當(dāng)然是到了不支持不行的時候了。

沒有泛型之前,我們可以這樣寫代碼:

  1. ArrayList list = new ArrayList(); 
  2. list.add("沉默王二"); 
  3. list.add(new Date()); 

不管是 String 類型,還是 Date 類型,都可以一股腦塞進 ArrayList 當(dāng)中,這看起來似乎很方便,但取的時候就悲劇了。

  1. String s = list.get(1); 

這樣取行嗎?

不行。

還得加上強制轉(zhuǎn)換。

  1. String s = (String) list.get(1); 

但我們知道,這行代碼在運行的時候必然會出錯:

  1. Exception in thread "main" java.lang.ClassCastException: java.util.Date cannot be cast to java.lang.String 

這就又回到“兼容性”的問題了。

Java 語言和其他編程語言不一樣,有著沉重的歷史包袱,1.5 之前已經(jīng)有大量的程序部署在生產(chǎn)環(huán)境下了,這時候如果一刀切,原來沒有使用泛型的代碼直接扼殺了,后果不堪想象。

Java 一直以來都強調(diào)兼容性,我認為這也是 Java 之所以能被廣泛使用的主要原因之一,開發(fā)者不必擔(dān)心 Java 版本升級的問題,一個在 JDK 1.4 上可以跑的代碼,放在 JDK 1.5 上仍然可以跑。

這里必須得說明一點,J2SE1.5 的發(fā)布,是 Java 語言發(fā)展史上的重要里程碑,為了表示該版本的重要性,J2SE1.5 也正式更名為 Java SE 5.0,往后去就是 Java SE 6.0,Java SE 7.0。。。。

但 Java 并不支持高版本 JDK 編譯生成的字節(jié)碼文件在低版本的 JRE(Java 運行時環(huán)境)上跑。

針對泛型,兼容性具體表現(xiàn)在什么地方呢?仔細看下面這段代碼。

  1. ArrayList<Integer> ints = new ArrayList<Integer>(); 
  2. ArrayList<String> strs = new ArrayList<String>(); 
  3. ArrayList list; 
  4. list = ints; 
  5. list = strs; 

如果要實現(xiàn)泛型,又要保證之前的代碼不受影響,上面這段代碼必須得能夠編譯運行。怎么辦呢?

就只能搞類型擦除了!

真所謂“表面上一套,背后玩另外一套”呀!

編譯前進行泛型檢測,ArrayList 只能放 Integer,ArrayList 只能放 String,取的時候就不用擔(dān)心類型強轉(zhuǎn)出錯了。

但編譯后的字節(jié)碼文件里,是沒有泛型的,放的都是 Object。

Java 神奇就神奇在這,表面上萬物皆對象,但為了性能上的考量,又存在 int、double 這種原始類型,但原始類型又沒辦法和 Object 兼容,于是我們就只能寫 ArrayList 這樣很占用內(nèi)存空間的代碼。

這恐怕也是 Java 泛型被吐槽的原因之一了。

一個好消息是 Valhalla 項目正在努力解決這些因為泛型擦除帶來的歷史遺留問題。

Project Valhalla:正在進行當(dāng)中的 OpenJDK 項目,計劃給未來的 Java 添加改進的泛型支持。

源碼地址:http://openjdk.java.net/projects/valhalla/

希望能給我們帶來真正意義上的泛型?也許 9 月份的 JDK 17 就有了?

怎么樣?類型擦除這個案可以結(jié)了吧?

我是“福爾摩斯”上身的二哥呀,我們下期見~

本文轉(zhuǎn)載自微信公眾號「沉默王二」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系沉默王二公眾號。

 

責(zé)任編輯:武曉燕 來源: 沉默王二
相關(guān)推薦

2021-12-30 19:34:15

Java泛型JDK

2022-07-12 06:17:43

GoogleGolang開發(fā)工作

2024-01-15 08:28:31

Spring事件

2012-05-01 08:06:49

手機

2020-12-21 16:18:07

JavaTypeToken泛型擦除

2021-07-01 06:47:30

Java泛型泛型擦除

2012-07-13 00:03:08

WEB前端開發(fā)WEB開發(fā)

2019-12-10 08:00:46

Kata容器Linux

2015-08-13 10:54:46

2015-09-14 09:28:47

2009-02-19 10:21:00

路由多WAN口

2021-03-18 16:05:20

SSD存儲故障

2021-05-17 08:18:35

Java內(nèi)存模型JMM

2012-01-02 19:30:22

iPad

2024-03-18 00:00:05

Java服務(wù)JVM

2011-08-22 16:42:43

SqliteiPad

2024-06-07 10:05:31

2023-03-06 08:33:24

IDEA反編譯類型

2019-09-04 00:20:10

JSON泛型擦除

2011-08-01 17:31:25

Xcode開發(fā) Cocoa
點贊
收藏

51CTO技術(shù)棧公眾號

欧洲av一区二区| 欧美日本网站| 1024日韩| 亚洲色图av在线| 在线免费观看av网| 色在线视频观看| 亚洲欧洲av一区二区三区久久| 国产精品久久亚洲| 中文字幕视频在线播放| 国产专区一区| 中文字幕欧美日韩va免费视频| 久久精品aⅴ无码中文字字幕重口| 校园春色亚洲| 亚洲精品国久久99热| 欧美精品二区三区四区免费看视频| 亚洲图片中文字幕| av成人黄色| 欧美成人激情在线| 国产伦理片在线观看| 91精品国产自产在线丝袜啪| 在线亚洲+欧美+日本专区| 国产视频在线观看网站| av中文资源在线| proumb性欧美在线观看| 成人激情av在线| 久久国产乱子伦精品| 国产精品videosex极品| 久久久国产成人精品| 90岁老太婆乱淫| 成人爽a毛片| 制服丝袜亚洲网站| 国产精品视频分类| www.8ⅹ8ⅹ羞羞漫画在线看| 亚洲丝袜制服诱惑| 亚洲精品一区二区毛豆| 飘雪影视在线观看免费观看 | 伊人久久大香线蕉综合网站| 日韩三区在线观看| 看看黄色一级片| 视频精品导航| 欧美午夜在线一二页| 精品人妻一区二区三区四区在线 | 欧美猛男男男激情videos| 欧美成人艳星乳罩| 欧美专区第二页| 日韩电影精品| 欧美日韩综合色| 在线观看免费成人av| 黄瓜视频成人app免费| 欧美视频一区二区三区…| 大西瓜av在线| 国产在线xxx| 亚洲一线二线三线久久久| 久久久久亚洲av无码专区喷水| 9色在线观看| 中文子幕无线码一区tr| 日韩欧美精品在线不卡 | 澳门久久精品| 日韩一区二区精品| 日本人妻一区二区三区| 中文字幕视频精品一区二区三区| 精品少妇一区二区三区在线视频| 亚洲v在线观看| 国产精品对白| 日韩电影在线观看中文字幕| 97伦伦午夜电影理伦片| 精品国产中文字幕第一页| 国产亚洲人成a一在线v站| 91精品国自产在线| 99成人在线视频| 欧美巨猛xxxx猛交黑人97人| 国产乡下妇女做爰毛片| 午夜综合激情| 国产精品免费网站| 国产精品综合在线| 国产91丝袜在线播放0| 国产精品综合久久久久久| 亚洲av成人无码网天堂| 国产午夜精品一区二区三区嫩草| 日本成人黄色| 毛片在线播放a| 亚洲一区二区三区自拍| 国产福利视频在线播放| 高清一区二区三区av| 精品久久久久久久久久久久久久久 | 日韩国产小视频| 2022成人影院| 欧美日韩mp4| 国产av一区二区三区传媒| 米奇777超碰欧美日韩亚洲| 日韩中文字幕在线视频| 国产一级做a爰片在线看免费 | 亚欧激情乱码久久久久久久久| 99精品女人在线观看免费视频| 欧美va亚洲va香蕉在线| 97伦伦午夜电影理伦片| 欧美一区成人| 奇米四色中文综合久久| 国产视频第二页| 久久一留热品黄| 欧美aaa在线观看| 欧亚av在线| 日韩欧美视频在线| 国产三级av在线播放| 欧美在线黄色| 国产成人精品午夜| 成人免费一级视频| 国产精品理论在线观看| 欧美成人高潮一二区在线看| 高清不卡一区| 搡老女人一区二区三区视频tv| 日韩精品一区二区在线播放 | 欧美丝袜一区二区三区| 中文字幕第三区| 精品国产日韩欧美| 97色伦亚洲国产| 国产高中女学生第一次| 日本一区二区三区dvd视频在线| 成年女人18级毛片毛片免费| 日本免费成人| 国产亚洲视频中文字幕视频| 欧美亚洲天堂网| 国产精品一区二区久久不卡| 日韩一区二区电影在线观看| 极品av在线| 精品少妇一区二区三区视频免付费| 三区四区在线观看| 亚洲综合99| 国产精品二区三区四区| www.欧美日本韩国| 欧美高清性hdvideosex| 男女男精品视频网站| 男人的天堂亚洲| 久久久久九九九| aa国产成人| 制服视频三区第一页精品| 天天操天天舔天天射| 久久一区视频| 日本在线成人一区二区| 亚洲最大网站| 亚洲男人第一网站| 天天操天天摸天天干| 成人免费毛片app| 草草视频在线免费观看| 中文字幕日韩在线| 午夜精品久久久久久久久久久久 | 96日本xxxxxⅹxxx17| 欧美激情一区在线| 粉嫩虎白女毛片人体| 曰本一区二区三区视频| 国产成人福利网站| jizz在线观看中文| 欧美色综合久久| 国精产品久拍自产在线网站| 狠狠色丁香久久婷婷综| 国产大尺度在线观看| 免费精品一区| 九九久久久久99精品| 成人小说亚洲一区二区三区| 亚洲综合色视频| 星空大象在线观看免费播放| 亚洲福利一区| 日本午夜一区二区三区| 国产福利亚洲| 欧美另类老女人| 神马午夜精品95 | 国产毛片毛片毛片毛片毛片| 亚洲人成人一区二区在线观看 | 97精品久久久久中文字幕| 亚洲 高清 成人 动漫| 亚洲资源网站| 国产美女高潮久久白浆| 午夜伦理大片视频在线观看| 亚洲国产高清高潮精品美女| 手机看片久久久| 国产精品免费久久久久| 日韩av成人网| 日韩专区一卡二卡| 警花观音坐莲激情销魂小说| 盗摄系列偷拍视频精品tp| 日韩美女激情视频| 国产人成网在线播放va免费| 精品乱人伦小说| 久久久久久在线观看| 亚洲丝袜美腿综合| 五级黄高潮片90分钟视频| 久久国产精品露脸对白| 国产免费一区二区视频| 加勒比久久综合| 91久久中文字幕| 蜜桃视频动漫在线播放| 久久精品国产亚洲精品| 姝姝窝人体www聚色窝| 欧美日韩综合不卡| 国产一级性生活| 欧美激情资源网| 国产伦理在线观看| 日韩高清一级片| 日本精品久久久久久久久久| 凹凸成人精品亚洲精品密奴| 国产精品日本一区二区| 黄色成人在线视频| 91黄色8090| 成人午夜在线影视| 亚洲人a成www在线影院| 亚洲精品一区二区三区不卡| 91久久线看在观草草青青| 久久久精品视频在线| 亚洲国产岛国毛片在线| jlzzjizz在线播放观看| 国内精品视频666| www.日日操| 亚洲影音先锋| 黄色大片中文字幕| 午夜日韩av| 亚洲美女搞黄| 国产在视频线精品视频www666| 成人资源av| 精品成人18| 91精品久久久久久久久| 88xx成人免费观看视频库| 91精品国产乱码久久久久久蜜臀| 91最新在线视频| 亚洲理论在线a中文字幕| 亚洲av无码乱码国产精品久久| 欧美日韩一区二区三区在线| 日本视频免费观看| 欧美日韩中文字幕日韩欧美| 免费在线观看黄视频| 亚洲欧美一区二区三区国产精品| 91成年人网站| 久久综合九色综合欧美亚洲| 久久性爱视频网站| 粉嫩av一区二区三区在线播放 | 国产欧美一区二区精品忘忧草 | 欧美一区二区黄片| 日韩欧美美女一区二区三区| 97caocao| 51精品视频一区二区三区| 在线免费观看av片| 精品婷婷伊人一区三区三| 久久久久久久亚洲| 在线观看成人小视频| 伊人中文字幕在线观看| 色国产综合视频| 91porny九色| 欧美色精品天天在线观看视频| www.亚洲激情| 欧美久久高跟鞋激| 99久久久国产精品无码免费| 91精品国模一区二区三区| 国产高清免费观看| 精品粉嫩超白一线天av| 蜜臀久久99精品久久久| 亚洲国产中文字幕在线观看 | 久久精品中文字幕一区| 黄色网页网址在线免费| 欧美成人免费在线视频| 男女视频在线| 97久久久免费福利网址| 都市激情综合| 国产一区二区在线免费视频| www久久久| 国产伦精品一区二区三区照片91 | 色呦呦网站入口| 午夜国产欧美理论在线播放 | 精品第一国产综合精品aⅴ| 欧美熟妇另类久久久久久不卡 | 久久先锋资源| 亚洲成人天堂网| 国产精品综合视频| 无码人妻一区二区三区在线| 91玉足脚交白嫩脚丫在线播放| 国产精品久久久久无码av色戒| 亚洲国产精品ⅴa在线观看| 美国黄色小视频| 天天影视色香欲综合网老头| 久久精品视频2| 8v天堂国产在线一区二区| 日本xxxx人| 亚洲香蕉在线观看| 日本欧美电影在线观看| 青青精品视频播放| 国产成人久久精品一区二区三区| 国产在线观看一区| 欧美一级精品片在线看| 亚洲小视频在线播放| 国产日韩一区| 91视频这里只有精品| 国产成人av一区二区三区在线观看| aaaaa级少妇高潮大片免费看| 中文字幕一区二区三区不卡在线| 日韩精品在线免费看| 欧美日韩午夜精品| 污污网站免费在线观看| 久久久97精品| 这里有精品可以观看| 亚洲已满18点击进入在线看片| 午夜精品福利影院| 亚洲国产精品女人| 日日夜夜一区二区| 黄色av电影网站| 国产精品盗摄一区二区三区| 日本免费观看视| 91精品久久久久久久91蜜桃| 加勒比一区二区三区在线| 色综合天天综合网国产成人网| 欧美日韩美女| 国产区一区二区三区| 久久久国产精品| 日日躁夜夜躁aaaabbbb| 久久夜色精品国产噜噜av| 国产成人精品av久久| 3d动漫精品啪啪一区二区竹菊 | 中文av一区特黄| av网站中文字幕| 亚洲第一色中文字幕| 中文字幕有码在线观看| 国产欧美日韩综合精品| 精品国产视频| 虎白女粉嫩尤物福利视频| 成人18视频日本| 国产精品成人国产乱| 日韩欧美中文一区二区| v片在线观看| 成人免费自拍视频| 欧美顶级大胆免费视频| 99热手机在线| 国产欧美日韩在线观看| 久久久成人免费视频| 日韩激情av在线播放| free性m.freesex欧美| 高清av免费一区中文字幕| 亚洲精品一区二区在线看| 五月天av在线播放| 国产精品久久三区| 亚洲图片中文字幕| 日韩小视频网址| 99精品美女视频在线观看热舞| 尤物一区二区三区| 国内精品伊人久久久久av一坑 | 在线成人激情| 图片区乱熟图片区亚洲| 亚洲欧美日韩国产中文在线| 国产精品久久久久精| 精品国产拍在线观看| 日韩五码电影| 亚洲天堂av免费在线观看| 精品一区二区免费在线观看| 国产精品丝袜一区二区| 欧美一级理论片| 丁香影院在线| 国语精品中文字幕| 午夜一区不卡| 国产精品av久久久久久无| 欧美色图12p| 麻豆视频在线观看免费网站| 亚洲影院色无极综合| 欧美视频福利| 麻豆国产精品一区| 色婷婷精品久久二区二区蜜臂av| 91精品国产91久久久久游泳池 | 看欧美ab黄色大片视频免费| 国产精品丝袜在线| 国产裸体无遮挡| 欧美精品videofree1080p| 清纯唯美亚洲经典中文字幕| 免费激情视频在线观看| 亚洲色图欧美偷拍| 神马午夜在线观看| 国产福利视频一区二区| 91tv官网精品成人亚洲| 欧美夫妇交换xxx| 在线观看一区不卡| 麻豆传媒视频在线观看免费| 国产精品v欧美精品v日韩精品| 另类天堂av| 日韩女优一区二区| 亚洲激情在线视频| 国产成人77亚洲精品www| 8x8x华人在线| 久久久久久久久久看片| 国产伦理一区二区| 欧美亚洲另类激情另类| 999精品色在线播放| 亚洲婷婷在线观看| 欧美在线free| av中文资源在线资源免费观看| 天堂av一区二区| 成人在线综合网站| 最近中文字幕在线免费观看| 欧美黑人xxxx| 四虎国产精品免费观看| 特大黑人巨人吊xxxx| 91精品国产日韩91久久久久久| 免费成人在线电影| 国产精品免费看久久久无码| 国产三级精品在线| 成人免费视频国产| 91欧美精品午夜性色福利在线 |