成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

Java不能真正泛型的原因是什么?

瀏覽:96日期:2023-02-10 16:35:22
目錄簡單來回顧一下類型擦除,看下面這段代碼。為什么 Java 不能實現真正意義上的泛型呢?背后的原因是什么?第一,兼容性第二,不是“實現不了”總結簡單來回顧一下類型擦除,看下面這段代碼。

public class Cmower { public static void method(ArrayList<String> list) {System.out.println('Arraylist<String> list'); } public static void method(ArrayList<Date> list) {System.out.println('Arraylist<Date> list'); }}

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

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

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

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

也就是說,按照我們的假設:如果 Java 能夠實現真正意義上的泛型,兩個 method() 方法是可以同時存在的,就好像方法重載一樣。

public class Cmower { public static void method(String list) { } public static void method(Date list) { }}為什么 Java 不能實現真正意義上的泛型呢?背后的原因是什么?第一,兼容性

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

想象一下,你的代碼原來運行的好好的,就因為 JDK 的升級,導致所有的源代碼都無法編譯通過并且無法運行,是不是會非常痛苦?

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

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

第二,不是“實現不了”

這部分內容參考自 R大@RednaxelaFX

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

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

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

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

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

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

class StoreSomething<A> { A something; StoreSomething(A something) { this.something = something; } void set(A something) { this.something = something; } A get() { return something; }}

這個 A 呢,可以是任何合法的 Java 類型:

StoreSomething<String> a = new StoreSomething('I’m a string!');StoreSomething<int> b = new StoreSomething(17+4);b.set(9);int i = b.get();String s = a.get();

對吧?這就是我們想要的“真正意義上的泛型”,A 不僅僅可以是引用類型 String,還可以是基本數據類型。要知道,Java 的泛型不允許是基本數據類型,只能是包裝器類型。

Java不能真正泛型的原因是什么?

除此之外,Pizza 的泛型還可以直接使用 new 關鍵字進行聲明,并且 Pizza 編譯器會從構造方法的參數上推斷出具體的對象類型,究竟是 String 還是 int。要知道,Java 的泛型因為類型擦除的原因,程序員是無法知道一個 ArrayList 究竟是 ArrayList<String> 還是 ArrayList<Integer> 的。

ArrayList<Integer> ints = new ArrayList<Integer>();ArrayList<String> strs = new ArrayList<String>();System.out.println(ints.getClass());System.out.println(strs.getClass());

輸出結果:

class java.util.ArrayList class java.util.ArrayList

都是 ArrayList 而已。

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

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

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

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

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

當然是到了不支持不行的時候了。

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

ArrayList list = new ArrayList();list.add('沉默王二');list.add(new Date());

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

String s = list.get(1);

這樣取行嗎?

不行。

還得加上強制轉換。

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

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

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

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

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

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

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

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

Java不能真正泛型的原因是什么?

針對泛型,兼容性具體表現在什么地方呢?

ArrayList<Integer> ints = new ArrayList<Integer>();ArrayList<String> strs = new ArrayList<String>();ArrayList list;list = ints;list = strs;

表現在上面這段代碼必須得能夠編譯運行。怎么辦呢?

就只能搞類型擦除了!

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

編譯前進行泛型檢測,ArrayList<Integer> 只能放 Integer,ArrayList<String> 只能放 String,取的時候就不用擔心類型強轉出錯了。

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

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

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

總結

本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關注好吧啦網的更多內容!

標簽: Java
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
久久久欧美精品sm网站| 亚洲黑丝在线| 很黄很黄激情成人| 日韩免费在线观看| 美女一区二区三区| 国产伦精品一区二区三| 中文字幕在线观看不卡视频| 国产精品12区| 亚洲欧美在线高清| 欧美在线1区| wwww国产精品欧美| 国产91丝袜在线播放九色| 色诱视频网站一区| 亚洲国产一区二区三区 | 亚洲18女电影在线观看| 日韩午夜激情| 91在线视频观看| 欧美一级午夜免费电影| 久久成人免费电影| 欧美制服丝袜第一页| 天天色综合天天| 西西人体一区二区| 亚洲美女屁股眼交| 国产精品99精品久久免费| 欧美怡红院视频| 久久精品国内一区二区三区| 色狠狠一区二区| 蜜乳av一区二区三区| 色综合天天综合在线视频| 日韩一级高清毛片| av午夜一区麻豆| 久久久国产一区二区三区四区小说| 波多野结衣91| 久久蜜臀精品av| 欧美午夜精品理论片a级大开眼界| 久久精品亚洲精品国产欧美 | 一区二区高清| 亚洲最大的成人av| 久久xxxx| 蜜臀久久99精品久久久画质超高清| 色噜噜狠狠色综合欧洲selulu| 免费成人在线网站| 欧美狂野另类xxxxoooo| 大胆欧美人体老妇| 国产片一区二区三区| 欧美三级不卡| 亚洲精品老司机| 国产精品尤物| 日本va欧美va精品发布| 欧洲精品一区二区| 国产成人免费视频网站| 久久综合九色综合欧美亚洲| 欧美体内she精视频在线观看| 亚洲视频在线观看一区| 国产伦精品一区| 美脚の诱脚舐め脚责91 | 欧美一级片在线看| caoporm超碰国产精品| 久久午夜免费电影| 亚洲精美视频| 天堂va蜜桃一区二区三区| 欧洲日韩一区二区三区| 国产成人精品免费网站| 国产日产欧美一区二区三区 | 欧美成人亚洲| 亚洲男同性视频| 久久永久免费| 国产精品夜夜爽| 国产欧美日韩不卡| 午夜一区二区三区不卡视频| 精品中文av资源站在线观看| 久久综合九色综合97_久久久| 在线日本高清免费不卡| 一区精品在线播放| 久久久99国产精品免费| 国产不卡视频在线播放| 国产精品免费丝袜| 久久国产直播| 国产成人精品亚洲日本在线桃色 | 日韩精品电影一区亚洲| 欧美一区欧美二区| 国产精品草草| 午夜伊人狠狠久久| 91精品国产品国语在线不卡| 欧美一区二区在线| 亚洲小说欧美激情另类| 欧美一区二区三区啪啪| 精品9999| 麻豆成人免费电影| 亚洲国产精品成人综合 | 国产精品推荐精品| 国产成人夜色高潮福利影视| 中文字幕不卡在线播放| 色系网站成人免费| 91免费在线看| 偷拍与自拍一区| 欧美一区二区视频在线观看2022| 亚洲天堂激情| 美女视频黄久久| 中文成人av在线| 在线观看免费成人| 色综合久久综合中文综合网| 香蕉成人伊视频在线观看| 日韩一级片在线播放| 成人免费在线视频观看| 在线精品视频免费观看| 午夜精品亚洲一区二区三区嫩草| 最新成人av在线| 欧美在线啊v一区| 成人av影视在线观看| 一区二区三区 在线观看视频| 在线免费观看日本一区| 色综合色狠狠综合色| 亚洲一级电影视频| 精品国产乱码久久久久久闺蜜| 亚洲精选国产| 国产伦理精品不卡| 亚洲婷婷在线视频| 欧美日韩在线播放三区四区| 伊人久久av导航| 久久精品国产77777蜜臀| 色综合久久久网| 91社区在线播放| 日韩av中文在线观看| 国产精品久久久久9999吃药| 欧美日韩一区二区三区不卡| av在线一区二区三区| 午夜激情综合网| 欧美精品一区二| 欧美在线观看一区| 国产精品www.| 国内成人自拍视频| 国产精品色噜噜| 欧美挠脚心视频网站| 伊人成人在线视频| 国产综合成人久久大片91| 1区2区3区国产精品| 欧美sm美女调教| 日本精品一区二区三区四区的功能| 欧美国产三区| 精品综合久久久久久8888| 中文字幕在线观看不卡视频| 久久久久一区二区| 国产一区二区在线观看视频| 亚洲综合清纯丝袜自拍| 国产91在线|亚洲| 午夜电影一区二区| 国产精品亲子伦对白| 欧美一区二区在线不卡| 久久精品网址| 一区二区三区你懂的| 97精品久久久午夜一区二区三区| 美女在线视频一区| 亚洲精品视频在线看| 欧美国产禁国产网站cc| 日韩网站在线看片你懂的| 亚洲一区日韩| 欧美精选在线| 国产乱码精品一区二区三区五月婷| 一区二区三区在线视频播放| 久久久久成人黄色影片| 欧美另类变人与禽xxxxx| 99成人在线| 欧美精品国产| 粉嫩在线一区二区三区视频| 免费成人美女在线观看| 亚洲高清免费一级二级三级| 亚洲女女做受ⅹxx高潮| 国产精品青草久久| 国产亚洲午夜高清国产拍精品| 日韩精品一区二区三区swag| 欧美日韩一区三区四区| 欧美最猛性xxxxx直播| 欧美亚洲自偷自偷| 国产精品日韩高清| 亚洲一区二区在线免费观看| 99av国产精品欲麻豆| 国产精品五区| 韩日成人在线| av不卡免费电影| 国产一区二区主播在线| 日韩黄色片在线观看| 亚洲精品美腿丝袜| 中文文精品字幕一区二区| 久久久91精品国产一区二区精品 | 中文字幕中文字幕一区| 久久影院视频免费| 欧美v国产在线一区二区三区| 欧美视频中文字幕| 欧美丝袜丝交足nylons| 91久久精品午夜一区二区| 免费一级欧美片在线播放| 夜夜精品视频| 亚洲人妖在线| 亚洲大胆在线| 亚洲视频欧美在线| 亚洲欧美伊人| 激情欧美国产欧美| 午夜精品美女久久久久av福利| 99视频一区二区三区|