精品欧美一区二区三区在线观看 _久久久久国色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综合色区无码一区爱av | 天堂99x99es久久精品免费| 国产制服丝袜一区| 久久久久久久久久久网站| 800av在线播放| 高清在线一区| 亚洲午夜精品在线| 日韩欧美国产二区| 性一交一乱一伧老太| 久久人人超碰| 久久精品电影网站| 中文字幕丰满乱子伦无码专区| 91视频亚洲| 色婷婷综合久色| 欧美久久久久久久久久久久久久| 欧美理论在线观看| 国产精品亚洲第一| 国产精品xxxxx| 国产五月天婷婷| 久久国产成人精品| 日韩久久精品电影| 女人扒开双腿让男人捅 | 精品久久久久久亚洲国产300 | 亚洲国产欧美视频| 亚洲精品高潮| 538在线一区二区精品国产| 男人的天堂99| 超碰中文在线| 亚洲男人天堂一区| 亚洲人体一区| 免费在线黄色网址| av不卡免费电影| 99视频网站| 91丨九色丨蝌蚪丨对白| 久久亚洲图片| 欧美一区二区影院| www日韩精品| 91久久综合| 欧美激情一级欧美精品| 青青草原在线免费观看| 黄色国产在线观看| 精品国产三区在线| 欧美精品v日韩精品v韩国精品v| 日本wwww视频| 蜜桃av.网站在线观看| 亚洲一区二区三区四区在线观看| 国产一二三四五| 五月天婷婷在线视频| 国产亲近乱来精品视频| 日韩欧美视频第二区| 亚洲人午夜射精精品日韩| 丰满放荡岳乱妇91ww| 51成人做爰www免费看网站| 97人妻精品一区二区三区视频 | 韩国中文字幕2020精品| 91麻豆精东视频| 免费久久99精品国产自| 日本高清中文字幕二区在线| 97se亚洲国产综合自在线不卡| 国产亚洲精品自在久久| 午夜影院在线视频| 2020国产精品久久精品美国| 日本免费高清一区| av中文天堂在线| 国产精品久久久久久久久久久免费看 | 99久久九九| 久久婷婷国产麻豆91天堂| 黄视频网站免费看| 国产精品大片| 欧美一级大片在线免费观看| 福利网址在线观看| 日韩不卡在线观看日韩不卡视频| 国产日韩欧美一二三区| 国产伦子伦对白视频| 国产成人8x视频一区二区| 国产久一道中文一区| 新呦u视频一区二区| 亚洲欧美国产高清va在线播放| 懂色av中文字幕一区二区三区| 国产一区二区视频在线免费观看| 色鬼7777久久| 国产精品毛片大码女人| 91精品一区二区三区四区| 黄色成人在线网| 色88888久久久久久影院按摩| 女人高潮一级片| 香蕉成人app| 亚洲性夜色噜噜噜7777| 国产一二三区精品| 国产欧美一区二区三区国产幕精品| 日韩美女免费观看| 国产三级小视频| 91美女片黄在线观看| 亚洲视频导航| 国产传媒在线观看| 欧美日韩高清一区二区不卡| 国产大尺度视频| 欧美亚洲在线日韩| 欧美激情性做爰免费视频| 日韩在线视频不卡| 国产精品一区二区视频| 日韩av免费电影| 人交獸av完整版在线观看| 一本久久综合亚洲鲁鲁五月天| 亚洲视频第二页| 日韩一级电影| 欧美大胆a视频| 中文字幕免费观看| 丰满白嫩尤物一区二区| 亚洲精品影院| 日韩在线伦理| 日韩精品一区二区三区视频播放| 白白色免费视频| 国产主播精品| 国产中文日韩欧美| 国产精品一区二区婷婷| 亚洲福利电影网| 国产精品久久久久久久99| 中文精品一区二区| 高清欧美性猛交xxxx黑人猛交| 亚洲熟女乱色一区二区三区久久久| 国产普通话bbwbbwbbw| 99香蕉国产精品偷在线观看| 亚洲wwwav| 一本一道波多野毛片中文在线| 精品电影在线观看| 久久久久亚洲av无码网站| 国产精品99在线观看| 国产精品白嫩初高中害羞小美女| 欧美一级一区二区三区| 亚洲乱码国产乱码精品精的特点 | 日本成人性视频| 成人h在线观看| 亚洲人成电影网站| 国产成人免费看| 成人免费三级在线| www.激情网| 日韩中文字幕无砖| 蜜月aⅴ免费一区二区三区| 中文字幕资源网| 欧美国产1区2区| 无码内射中文字幕岛国片| 日韩超碰人人爽人人做人人添| 久久久免费电影| 欧美一级特黄aaaaaa| 亚洲高清免费观看高清完整版在线观看 | 亚洲国产成人在线播放| 久久久久久天堂| 豆国产96在线|亚洲| 日韩精品在线观看av| 一区二区三区在线资源| 欧美激情一级二级| 天天综合在线视频| 欧美性猛交丰臀xxxxx网站| 99re久久精品国产| 亚洲一区二区网站| 欧洲精品久久| 欧美特黄色片| 久久影视免费观看| 国产成人三级在线观看视频| 午夜欧美在线一二页| 一级特黄a大片免费| 午夜在线视频观看日韩17c| 看欧美日韩国产| 国产精品久久久久久久乖乖| 久久精品97| 日韩视频免费观看| 国内毛片毛片毛片毛片| 亚洲国产精品人人做人人爽| 艳妇乳肉亭妇荡乳av| 久热综合在线亚洲精品| 亚洲欧美99| 无人区乱码一区二区三区| 性色av一区二区三区在线观看 | 伊人国产精品| 久久久久久久一区二区| 亚洲欧美自偷自拍| 欧美丝袜丝交足nylons| 深夜福利影院在线观看| av爱爱亚洲一区| 天天干天天爽天天射| 中文字幕亚洲综合久久五月天色无吗'' | 欧美二区在线播放| 外国精品视频在线观看 | 美女被啪啪一区二区| 国产 日韩 欧美一区| 久久精品免费播放| 日批视频在线播放| 欧美私模裸体表演在线观看| 精品少妇久久久| 国产日韩三级在线| 18深夜在线观看免费视频| 免费永久网站黄欧美| 国产卡一卡二在线| 欧美男男gaytwinkfreevideos| 成人啪啪免费看| 欧美性xxx| 久久91精品国产91久久久| 国产在线资源| 精品国产伦一区二区三区观看方式 | 拍真实国产伦偷精品| 日韩av网站在线| 国产精品爽爽久久久久久| 天天av天天翘天天综合网色鬼国产| 亚洲不卡的av| 91麻豆文化传媒在线观看| 久久精品无码一区二区三区毛片| 久久久久久穴| 99视频在线免费播放| 一区二区电影| 午夜视频久久久| 要久久电视剧全集免费| 99国产在线视频| 精品69视频一区二区三区| 欧美一级在线亚洲天堂| 青草青在线视频| 日韩在线高清视频| 成人免费视频| 亚洲欧美国产日韩中文字幕| 亚洲成人中文字幕在线| 这里只有精品99re| 艳妇乳肉豪妇荡乳av无码福利| 亚洲国产视频一区| 色在线观看视频| 国产精品久久久久久久久久免费看| 深爱五月激情网| av亚洲精华国产精华| 精品国产免费久久久久久婷婷| 精品在线观看免费| 91色国产在线| 日本欧美加勒比视频| 女性隐私黄www网站视频| 日韩午夜高潮| 国产精品裸体瑜伽视频| 欧美亚韩一区| 成年女人18级毛片毛片免费| 欧美激情视频一区二区三区在线播放| 一区二区精品国产| 四虎成人av| 在线不卡日本| 婷婷亚洲综合| gogogo免费高清日本写真| 日韩国产一区二区| 亚洲一卡二卡三卡| 999国产精品视频| 在线免费观看成人| 欧美在线三区| 国产xxxx振车| 亚洲国产mv| www.中文字幕在线| 美女精品一区| www.涩涩涩| 久久精品国产成人一区二区三区| 粉色视频免费看| 国产另类ts人妖一区二区| 精品无码av一区二区三区不卡| 国产精品1区2区3区在线观看| 日本少妇一区二区三区| 国产成人欧美日韩在线电影| 野战少妇38p| 26uuu国产在线精品一区二区| 亚洲一区二区三区蜜桃| 中文字幕二三区不卡| 北条麻妃在线观看视频| 亚洲精品成a人| 青青草成人av| 欧美亚洲国产bt| 国产丰满美女做爰| 亚洲国产精品高清久久久| 你懂的在线观看视频网站| 中文日韩在线观看| 婷婷在线播放| 浅井舞香一区二区| 久久国产三级| 国产一区二区久久久| 国产亚洲一区| 懂色av粉嫩av蜜臀av| 雨宫琴音一区二区在线| 凹凸日日摸日日碰夜夜爽1| 激情综合色综合久久| 精品国产aⅴ一区二区三区东京热| 91年精品国产| 搜索黄色一级片| 精品色蜜蜜精品视频在线观看| 免费av中文字幕| 日韩欧美国产成人一区二区| 欧美午夜黄色| 久久资源免费视频| 一二三四视频在线中文| 国产免费一区二区三区香蕉精| 白白在线精品| 亚洲国产一区在线| 亚洲黄色精品| 91亚洲精品久久久蜜桃借种| 暴力调教一区二区三区| 911国产在线| 粉嫩老牛aⅴ一区二区三区| 国产免费一区二区三区最新不卡 | 一女三黑人理论片在线| 亚洲欧洲国产专区| 免费观看成人毛片| 欧美一区二区三区不卡| 国产在线一二| 韩国精品美女www爽爽爽视频| 韩国精品视频在线观看| 久久精品日产第一区二区三区| 99久久精品网站| 另类小说第一页| 91一区二区在线| 久久婷婷国产麻豆91| 欧美精品乱人伦久久久久久| 日本天堂在线| 91精品国产91久久久久久吃药 | 日韩精品资源二区在线| 午夜视频在线观看网站| 日本一区二区在线播放| 国产精品chinese在线观看| 波多野结衣三级在线| 日韩福利电影在线| 五十路六十路七十路熟婆| 亚洲激情第一区| 国产又粗又猛又色又| 在线观看国产欧美| 巨茎人妖videos另类| 国产偷久久久精品专区| 韩国一区二区三区在线观看| 久久精品视频在线观看免费| 国产精品看片你懂得| 中文字幕二区三区| 国产一区二区三区视频| 性欧美videohd高精| 美女被啪啪一区二区| 国产欧美在线| 大地资源二中文在线影视观看 | 美女久久久久久久久久久| 国产精品蜜月aⅴ在线| 丝袜美腿玉足3d专区一区| 久久亚洲色图| 国产精品理论在线| 欧美日韩中字一区| 午夜看片在线免费| 国产日韩中文在线| 欧美大片aaaa| 国产乱码一区二区三区四区| 亚洲欧洲99久久| 国产按摩一区二区三区| 久久99亚洲热视| xxxxxhd亚洲人hd| 又粗又黑又大的吊av| 99久久精品国产毛片| 999这里只有精品| 亚洲区中文字幕| 99久久婷婷国产综合精品首页| 亚欧精品在线| 国产乱码精品一区二区三| 校园春色 亚洲| 精品美女被调教视频大全网站| 国产精品蜜臀| 美女精品国产| 蜜桃av噜噜一区二区三区小说| 永久免费未视频| 精品奇米国产一区二区三区| 美女扒开腿让男人桶爽久久软| 你懂的网址一区二区三区| 日韩不卡一二三区| 高h视频免费观看| 亚洲精品按摩视频| 日本精品裸体写真集在线观看| 亚洲国产精品久久久久婷婷老年| 激情深爱一区二区| 日本三级中文字幕| 亚洲性生活视频| 久久久久久爱| 激情六月丁香婷婷| 亚洲视频一二三区| 色窝窝无码一区二区三区| 欧美一级淫片丝袜脚交| 999久久久国产精品| 色哟哟视频在线| 在线观看网站黄不卡| av毛片在线播放| 久久综合九色综合久99| 另类的小说在线视频另类成人小视频在线| 国产在线免费看| 日韩av在线最新| 先锋影音网一区二区| 成人午夜免费在线| 中文字幕av免费专区久久| 亚洲黄色小说网址| 国产精品 欧美在线| 午夜精品网站| 鲁丝一区二区三区| 亚洲高清久久网| 亚洲欧美在线成人| 性欧美大战久久久久久久| 中文字幕精品三区| 五月婷婷六月丁香| 91亚洲va在线va天堂va国| 麻豆91精品|