日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

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

瀏覽:175日期: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
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
99国产精品99久久久久久粉嫩| 国产精品三级| 欧美成人精品三级网站| 中文字幕色婷婷在线视频| 久久影视三级福利片| 美女av一区| 久久字幕精品一区| 国产精品红桃| 国产一区二区三区天码| 在线看片福利| 久久精选视频| 一区二区亚洲精品| 亚洲精品一级二级三级| 久久国产尿小便嘘嘘| 免费看久久久| 日韩一区三区| 激情久久久久久久| 日本 国产 欧美色综合| 日韩亚洲精品在线观看| 国产精品视频一区二区三区四蜜臂 | 欧美日韩在线观看视频小说| 99久久99久久精品国产片果冰| 婷婷激情久久| 中文一区在线| 人人精品久久| 精品国产乱码久久久| 日韩毛片视频| 性欧美长视频| 国产精品一区二区三区av麻| 久久99国产精品视频| 在线观看精品| 丝袜国产日韩另类美女| 国产日本亚洲| 色爱综合网欧美| 国产在线日韩| 综合日韩在线| 欧美国产不卡| 香蕉久久精品| 天堂va欧美ⅴa亚洲va一国产| 国产精品久久久久久久久久久久久久久 | 国产亚洲精品美女久久 | 久久成人福利| 婷婷激情久久| 日韩一区精品| 伊人久久在线| 亚洲无线观看| 国产一区2区| 不卡中文一二三区| 国产乱人伦精品一区| 日韩不卡在线| 日本成人在线一区| 欧美成人基地| 青草av.久久免费一区| 99久久www免费| 国产欧美另类| 日韩欧美一区二区三区免费观看| 日韩在线卡一卡二| 日本一二区不卡| 男人的天堂久久精品| 国产一区二区三区视频在线| 亚洲深夜福利在线观看| 亚洲免费福利| 欧美日韩中文| 午夜视频精品| 国产va免费精品观看精品视频| 老鸭窝毛片一区二区三区| 国产成人精品福利| 日韩精品乱码av一区二区| 久久久一本精品| 国产午夜一区| 日韩视频一区二区三区在线播放免费观看 | 国产精品亚洲二区| 欧美精品一区二区三区精品| 国产精品久久久久久久久免费高清| 欧美69视频| 精品视频91| 亚洲开心激情| 在线一区电影| 97视频热人人精品免费| 青青在线精品| 免费美女久久99| 亚洲va在线| 欧美成人精品一级| 亚洲欧美网站| 在线日韩欧美| 国产va在线视频| 国产乱码精品一区二区亚洲| 在线视频亚洲欧美中文| 精品在线91| 国产精品亚洲一区二区三区在线观看| 国产剧情在线观看一区| 亚洲精品欧美| 久久成人国产| 欧美日韩国产在线观看网站 | 精品视频高潮| 国产欧美自拍| 亚洲美女91| 亚洲一区免费| 91国语精品自产拍| 私拍精品福利视频在线一区| 日韩1区2区| 麻豆视频一区| 美女精品视频在线| 欧美激情 亚洲a∨综合| 国产精品日韩精品在线播放| 91大神在线观看线路一区| 亚洲青青久久| 三级欧美在线一区| 999在线观看精品免费不卡网站| 91精品亚洲| 欧美二三四区| 一区二区精品伦理...| 高清av一区| 高清一区二区| 在线天堂中文资源最新版| 国产一区二区久久久久| 美女在线视频一区| 国产精品嫩草影院在线看| 日韩精品免费一区二区夜夜嗨| 亚洲一区二区三区中文字幕在线观看| 中文一区二区| 免费成人在线视频观看| 丝袜美腿高跟呻吟高潮一区| 最新亚洲一区| 首页亚洲欧美制服丝腿| 免费一区二区视频| 中文视频一区| 亚洲免费成人av在线| 亚洲精品一级二级三级| 日韩精品一页| 国产亚洲第一伦理第一区| 国产精品免费大片| 黄色网一区二区| 欧美羞羞视频| 欧美日韩一二三四| 久久亚洲图片| 欧美一区二区三区久久| 欧美a一区二区| 欧美一级鲁丝片| 国产综合婷婷| 免费精品视频在线| 日韩国产在线观看| 久久中文字幕一区二区三区| 日韩精品中文字幕第1页| 精品欧美激情在线观看| 中文字幕成人| 麻豆成人av在线| 精品亚洲美女网站| 99成人在线| 欧美一级网址| 日本久久综合| 欧美日韩国产探花| 日韩不卡一区二区三区| 精品在线网站观看| 久久精品欧美一区| 日韩中文字幕1| 久久精品 人人爱| 精品福利久久久| 黄色av一区| 日韩成人在线看| 色婷婷亚洲mv天堂mv在影片| 午夜欧美在线| 日韩欧美精品一区二区综合视频| 国产精品草草| 99国产精品免费视频观看| 蜜臀91精品一区二区三区| 国产精品99精品一区二区三区∴ | 亚洲精品成a人ⅴ香蕉片| 老司机精品在线| 亚洲午夜一级| 欧美日韩a区| 99精品在线观看| 清纯唯美亚洲综合一区| 国产精品久久久久av电视剧| 欧美专区一区二区三区| 美日韩一区二区三区| 伊人精品一区| 国产亚洲一区二区三区不卡| 久久久噜噜噜| 日韩av在线免费观看不卡| 日韩欧美一区二区三区在线视频| 亚洲一区二区三区免费在线观看 | 久久高清免费观看| 国产福利资源一区| 国产精品嫩草99av在线| 欧美交a欧美精品喷水| 五月天综合网站| 国产精品男女| 一区免费视频| 国产一区二区三区四区大秀| 免费在线视频一区| 久久精品天堂| 亚洲综合专区| 国产欧美一区二区三区精品酒店| 中文字幕亚洲影视| 久久久成人网| 久久爱www.| 亚洲精品影视| 欧美亚洲国产激情| 欧美国产日本|