<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Read Sean

    Read me, read Sean.
    posts - 508, comments - 655, trackbacks - 9, articles - 4

    為什么Java不支持創(chuàng)建范型數(shù)組?

    Posted on 2005-08-09 09:36 laogao 閱讀(5172) 評(píng)論(3)  編輯  收藏 所屬分類(lèi): On Java

     

    最近看到BlogJava上有人在討論為什么Java范型不支持?jǐn)?shù)組http://m.tkk7.com/myqiao/archive/2005/08/08/9580.html

     

    我想這個(gè)問(wèn)題的答案是:因?yàn)檫@樣做會(huì)破壞類(lèi)型安全。核心的問(wèn)題在于Java范型和C#范型存在根本區(qū)別:Java的范型停留在編譯這一層,到了運(yùn)行時(shí),這些范型的信息其實(shí)是被抹掉的;而C#的范型做到了MSIL這一層。Java的做法不必修改JVM,減少了潛在的大幅改動(dòng)和隨之而來(lái)的風(fēng)險(xiǎn),也許同時(shí)也反映出Java Bytecode規(guī)范在設(shè)計(jì)之初的先天不足;C#則大刀闊斧,連CLR一起改以支持更徹底的范型,換句話(huà)說(shuō),在范型這一點(diǎn)上,感覺(jué)C#C++一點(diǎn)。

     

    Java中,Object[]數(shù)組可以是任何數(shù)組的父類(lèi),或者說(shuō),任何一個(gè)數(shù)組都可以向上轉(zhuǎn)型成它在定義時(shí)指定元素類(lèi)型的父類(lèi)的數(shù)組,這個(gè)時(shí)候如果我們往里面放不同于原始數(shù)據(jù)類(lèi)型 但是滿(mǎn)足后來(lái)使用的父類(lèi)類(lèi)型的話(huà),編譯不會(huì)有問(wèn)題,但是在運(yùn)行時(shí)會(huì)檢查加入數(shù)組的對(duì)象的類(lèi)型,于是會(huì)拋ArrayStoreException

     

    String[] strArray = new String[20];

    Object[] objArray = strArray;

    objArray[0] = new Integer(1); // throws ArrayStoreException at runtime

     

    因?yàn)?/SPAN>Java的范型會(huì)在編譯后將類(lèi)型信息抹掉,這樣如果Java允許我們使用類(lèi)似

     

    Map<Integer, String>[] mapArray = new Map<Integer, String>[20];

     

    這樣的語(yǔ)句的話(huà),我們?cè)陔S后的代碼中可以把它轉(zhuǎn)型為Object[]然后往里面放Map<Double, String>實(shí)例。這樣做不但編譯器不能發(fā)現(xiàn)類(lèi)型錯(cuò)誤,就連運(yùn)行時(shí)的數(shù)組存儲(chǔ)檢查對(duì)它也無(wú)能為力,它能看到的是我們往里面放Map的對(duì)象,我們定義的<Integer, String>在這個(gè)時(shí)候已經(jīng)被抹掉了,于是而對(duì)它而言,只要是Map,都是合法的。想想看,我們本來(lái)定義的是裝Map<Integer, String>的數(shù)組,結(jié)果我們卻可以往里面放任何Map,接下來(lái)如果有代碼試圖按原有的定義去取值,后果是什么不言自明。

     

    所以,Java編譯器不允許我們new范型數(shù)組。

     

     

    Feedback

    # re: 為什么Java不支持創(chuàng)建范型數(shù)組?  回復(fù)  更多評(píng)論   

    2008-05-31 00:37 by dieyingao
    突然看到,踩一下. 貌似和java對(duì) 泛型繼承上改成 <? extends T>的原因類(lèi)似.

    # re: 為什么Java不支持創(chuàng)建范型數(shù)組?  回復(fù)  更多評(píng)論   

    2009-10-16 09:25 by 深夜兩點(diǎn)
    我分析了一下為啥不支持泛型的數(shù)組。其實(shí)支持也不會(huì)引發(fā)什么大的問(wèn)題,只不過(guò)是個(gè)面子問(wèn)題。

    http://m.tkk7.com/deepnighttwo/articles/298426.html

    # re: 為什么Java不支持創(chuàng)建范型數(shù)組?  回復(fù)  更多評(píng)論   

    2009-10-16 11:14 by 大胃
    其實(shí)問(wèn)題的關(guān)鍵是Java數(shù)組的實(shí)現(xiàn),當(dāng)時(shí)條件艱苦,類(lèi)型系統(tǒng)不夠發(fā)達(dá),它需要一種"簡(jiǎn)單粗暴"的方式支持協(xié)變,比方說(shuō)Object[]可以是所有其他元素類(lèi)型的數(shù)組比如Integer[]的父類(lèi),這樣在方法簽名或變量定義中可以用Object[]"通殺"所有數(shù)組。

    所以Java數(shù)組就有了編譯期不檢查(沒(méi)法檢查),而在運(yùn)行期保有類(lèi)型信息并進(jìn)行檢查的行為(為類(lèi)型安全),盡管這樣的實(shí)現(xiàn)看上去既不安全,也不高效。

    有了泛型,不論是否有type-erasure,我們可以在很多場(chǎng)合避開(kāi)對(duì)類(lèi)似Object[]寫(xiě)法的依賴(lài),更好也更清楚的表達(dá)我們的真實(shí)意圖,從這個(gè)角度講,Java的泛型是有它積極的一面的,只是別跟數(shù)組這個(gè)老家伙較勁就好了。
    主站蜘蛛池模板: 久久久免费精品re6| 性感美女视频免费网站午夜| 国产免费区在线观看十分钟| 人妖系列免费网站观看| 亚洲网站在线观看| 久久亚洲精品国产精品黑人| 婷婷亚洲久悠悠色悠在线播放| 久久精品国产亚洲香蕉| 日本免费一本天堂在线| 免费看又黄又无码的网站| 香蕉成人免费看片视频app下载| 国产精品亚洲专区无码唯爱网| 亚洲国产精品无码观看久久| 亚洲欧洲日产国码久在线| 亚洲专区在线视频| 亚洲欧洲中文日韩久久AV乱码| 国产成人精品免费午夜app| 国产免费的野战视频| 成人无码区免费视频观看| 成人毛片免费观看视频大全| 最近中文字幕2019高清免费 | 免费欧洲毛片A级视频无风险| 无人在线观看免费高清| 无码中文字幕av免费放dvd| 四虎在线免费视频| 无人在线观看完整免费版视频| 波多野结衣免费一区视频| 99视频有精品视频免费观看| 九九精品免费视频| 又黄又爽的视频免费看| 亚洲色成人网站WWW永久| 免费A级毛片无码A∨男男| 国产偷国产偷亚洲清高动态图| 久久精品亚洲一区二区 | 免费观看亚洲人成网站| 亚洲精品无码国产| 亚洲人成综合在线播放| 久久久无码精品亚洲日韩京东传媒| 亚洲av无码国产综合专区| 小说区亚洲自拍另类| 免费观看91视频|