<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不支持創建范型數組?

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

     

    最近看到BlogJava上有人在討論為什么Java范型不支持數組http://www.tkk7.com/myqiao/archive/2005/08/08/9580.html

     

    我想這個問題的答案是:因為這樣做會破壞類型安全。核心的問題在于Java范型和C#范型存在根本區別:Java的范型停留在編譯這一層,到了運行時,這些范型的信息其實是被抹掉的;而C#的范型做到了MSIL這一層。Java的做法不必修改JVM,減少了潛在的大幅改動和隨之而來的風險,也許同時也反映出Java Bytecode規范在設計之初的先天不足;C#則大刀闊斧,連CLR一起改以支持更徹底的范型,換句話說,在范型這一點上,感覺C#C++一點。

     

    Java中,Object[]數組可以是任何數組的父類,或者說,任何一個數組都可以向上轉型成它在定義時指定元素類型的父類的數組,這個時候如果我們往里面放不同于原始數據類型 但是滿足后來使用的父類類型的話,編譯不會有問題,但是在運行時會檢查加入數組的對象的類型,于是會拋ArrayStoreException

     

    String[] strArray = new String[20];

    Object[] objArray = strArray;

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

     

    因為Java的范型會在編譯后將類型信息抹掉,這樣如果Java允許我們使用類似

     

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

     

    這樣的語句的話,我們在隨后的代碼中可以把它轉型為Object[]然后往里面放Map<Double, String>實例。這樣做不但編譯器不能發現類型錯誤,就連運行時的數組存儲檢查對它也無能為力,它能看到的是我們往里面放Map的對象,我們定義的<Integer, String>在這個時候已經被抹掉了,于是而對它而言,只要是Map,都是合法的。想想看,我們本來定義的是裝Map<Integer, String>的數組,結果我們卻可以往里面放任何Map,接下來如果有代碼試圖按原有的定義去取值,后果是什么不言自明。

     

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

     

     

    Feedback

    # re: 為什么Java不支持創建范型數組?  回復  更多評論   

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

    # re: 為什么Java不支持創建范型數組?  回復  更多評論   

    2009-10-16 09:25 by 深夜兩點
    我分析了一下為啥不支持泛型的數組。其實支持也不會引發什么大的問題,只不過是個面子問題。

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

    # re: 為什么Java不支持創建范型數組?  回復  更多評論   

    2009-10-16 11:14 by 大胃
    其實問題的關鍵是Java數組的實現,當時條件艱苦,類型系統不夠發達,它需要一種"簡單粗暴"的方式支持協變,比方說Object[]可以是所有其他元素類型的數組比如Integer[]的父類,這樣在方法簽名或變量定義中可以用Object[]"通殺"所有數組。

    所以Java數組就有了編譯期不檢查(沒法檢查),而在運行期保有類型信息并進行檢查的行為(為類型安全),盡管這樣的實現看上去既不安全,也不高效。

    有了泛型,不論是否有type-erasure,我們可以在很多場合避開對類似Object[]寫法的依賴,更好也更清楚的表達我們的真實意圖,從這個角度講,Java的泛型是有它積極的一面的,只是別跟數組這個老家伙較勁就好了。
    主站蜘蛛池模板: 99亚洲乱人伦aⅴ精品| 国产精品99精品久久免费| 国产成人亚洲综合网站不卡| 亚洲综合网美国十次| 日韩亚洲AV无码一区二区不卡| 国产aⅴ无码专区亚洲av| 亚洲国产精品va在线播放| 亚洲大尺度无码专区尤物| 亚洲Av熟妇高潮30p| 久久av无码专区亚洲av桃花岛| 亚洲黄色高清视频| 亚洲伊人精品综合在合线| 国产成人精品日本亚洲专| 国产亚洲午夜高清国产拍精品 | 国偷自产一区二区免费视频| 免费无码作爱视频| 久久青草国产免费观看| 久久w5ww成w人免费| 无码人妻一区二区三区免费 | 久久免费99精品国产自在现线| 久草免费福利在线| 免费A级毛片无码A∨| 免费看国产精品3a黄的视频| 久久精品视频免费| 精品成在人线AV无码免费看| 欧美在线看片A免费观看| 国产国产人免费人成免费视频 | 四虎1515hh永久久免费| 精品国产一区二区三区免费看| 免费人成在线观看网站视频 | 精品国产麻豆免费网站| 相泽亚洲一区中文字幕| 亚洲国语精品自产拍在线观看 | 久久久久亚洲av无码专区蜜芽 | 亚洲一区日韩高清中文字幕亚洲| 亚洲精品白浆高清久久久久久| 亚洲精品视频在线播放| 国产成人人综合亚洲欧美丁香花| 久久久久久国产a免费观看不卡| 5555在线播放免费播放| 国产小视频免费观看|