Java中為什么不能創(chuàng)建泛型數(shù)組

首先我們來看一個簡單的例子

Integer[] intArr = new Integer[1];
Object[] objArr = intArr;
objArr[0] = "xxx";

上面的這段代碼是可以正常編譯的张症,但在運行這段代碼的時候會報異常java.lang.ArrayStoreException

這是因為數(shù)組在創(chuàng)建的時候就確定了元素的類型驱犹,并且會記住該類型,每次向數(shù)組中添加值的時候霸株,都會做類型檢查,類型不匹配時就會拋異常java.lang.ArrayStoreException

知道了這個數(shù)組類型檢查機制后集乔,我們來看看創(chuàng)建泛型類的數(shù)組會有什么問題去件,首先我們創(chuàng)建一個泛型類:

public class A<T>{
    private T value;
    public A(T value) {
        this.value = value;
    }
    // 省略 get 和 set 方法
    // ...
}

我們嘗試來創(chuàng)建一個 A 類的數(shù)組:

A<String>[] arr = new A<String>[1]; // 編譯錯誤

上面的這行代碼根本不能通過編譯坡椒,也就是不允許我們創(chuàng)建泛型數(shù)組

為了解釋為什么不能創(chuàng)建泛型數(shù)組,這樣會帶來什么問題尤溜,我們假如上面的代碼可以通過編譯倔叼,接著看:

A<String>[] arr = new A<String>[1];
Object[] objArr = arr;
objArr[0] = new A<Integer>();

類似我們前面說的那樣,我們把 arr 賦給一個 Object[]宫莱,然后我們往數(shù)組中加入 A<Integer> 類型的值丈攒,這樣做是可以的,在編譯和運行期間都不會報錯授霸。因為泛型類型會被擦除巡验,A<String> 和 A<Integer> 的類型其實是一樣的:

System.out.println(new A<String>().getClass() == new A<Integer>().getClass());
// 輸出:true

這樣就逃過了數(shù)組的類型檢查機制,在我們使用中就會造成類型轉換錯誤碘耳。

所以显设,Java 中不允許創(chuàng)建泛型的數(shù)組。

注意

有一種繞過“不能創(chuàng)建泛型數(shù)組”限制的方法辛辨,就是使用強制類型裝換:

A<String>[] arr = (A<String>[]) new A[1];

當然捕捂,這么做是不安全的,當我們向數(shù)組中放入一個 A<Integer>斗搞,然后以 String 類型取出時會報異常java.lang.ClassCastException指攒,如下代碼所示:

A<String>[] arr = (A<String>[]) new A[1];
Object[] objArr = arr;
objArr[0] = new A<Integer>(1);
A<String> a = arr[0];
String s = a.getValue();
// java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市僻焚,隨后出現(xiàn)的幾起案子允悦,更是在濱河造成了極大的恐慌,老刑警劉巖虑啤,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件隙弛,死亡現(xiàn)場離奇詭異,居然都是意外死亡咐旧,警方通過查閱死者的電腦和手機驶鹉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來铣墨,“玉大人室埋,你說我怎么就攤上這事∫猎迹” “怎么了姚淆?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長屡律。 經(jīng)常有香客問我腌逢,道長,這世上最難降的妖魔是什么超埋? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任搏讶,我火速辦了婚禮佳鳖,結果婚禮上,老公的妹妹穿的比我還像新娘媒惕。我一直安慰自己系吩,他們只是感情好,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布妒蔚。 她就那樣靜靜地躺著穿挨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪肴盏。 梳的紋絲不亂的頭發(fā)上科盛,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機與錄音菜皂,去河邊找鬼贞绵。 笑死,一個胖子當著我的面吹牛幌墓,可吹牛的內容都是我干的但壮。 我是一名探鬼主播冀泻,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼常侣,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了弹渔?” 一聲冷哼從身側響起胳施,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎肢专,沒想到半個月后舞肆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡博杖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年椿胯,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片剃根。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡哩盲,死狀恐怖,靈堂內的尸體忽然破棺而出狈醉,到底是詐尸還是另有隱情廉油,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布苗傅,位于F島的核電站抒线,受9級特大地震影響,放射性物質發(fā)生泄漏渣慕。R本人自食惡果不足惜嘶炭,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一抱慌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧眨猎,春花似錦遥缕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至宝穗,卻和暖如春户秤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背逮矛。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工鸡号, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人须鼎。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓鲸伴,卻偏偏與公主長得像,于是被迫代替她去往敵國和親晋控。 傳聞我的和親對象是個殘疾皇子汞窗,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350