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

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

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

    Atea - Hero's Grave

    面向對象,開源,框架,敏捷,云計算,NoSQL,商業智能,編程思想。

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      40 隨筆 :: 0 文章 :: 28 評論 :: 0 Trackbacks
    JDK1.5引入的泛型,減少了類型強轉的代碼,增加了編譯檢查,提高了代碼的健壯性。
    但在某些情況,泛型檢查會出乎意料的“丟失”,由此可引發難以發現的bug。
     1 public class GenericDefectTest {
     2 
     3     public void test(final Map<String, String> map) {
     4         System.out.println(map.get("a"));// 這行可以正常執行
     5         System.out.println(map.get("b"));// 運行到這行才會報錯
     6         for (Map.Entry<String, String> entry : map.entrySet()) {
     7             System.out.println(entry.getValue());
     8         }
     9     }
    10 
    11     public static void main(final String args[]) throws Exception {
    12         GenericDefectTest genericTest = new GenericDefectTest();
    13 
    14         Map<String, Object> map = new HashMap<String, Object>();
    15         map.put("a""a");
    16         map.put("b"1);
    17         // new GenericTest().test(map);// 這里有編譯驗證,如果取消注釋會出錯。沒有問題
    18 
    19         // 但是如果用反射調用的話,就沒有驗證了,在實際使用這個值的時候才會報錯
    20         Method test = GenericDefectTest.class.getDeclaredMethod("test", Map.class);
    21         test.invoke(genericTest, map);
    22     }
    23 }
    我們期望程序執行到第三行就會報錯,但實際進行到第五行才會報錯。

    反編譯查看class
     1 public class GenericDefectTest
     2 {
     3   public void test(Map<String, String> map)
     4   {
     5     System.out.println((String)map.get("a"));
     6     System.out.println((String)map.get("b"));
     7     for (Map.Entry entry : map.entrySet())
     8       System.out.println((String)entry.getValue());
     9   }
    10 
    11   public static void main(String[] args) throws Exception
    12   {
    13     GenericDefectTest genericTest = new GenericDefectTest();
    14 
    15     Map map = new HashMap();
    16     map.put("a""a");
    17     map.put("b", Integer.valueOf(1));
    18 
    19     Method test = GenericDefectTest.class.getDeclaredMethod("test"new Class[] { Map.class });
    20     test.invoke(genericTest, new Object[] { map });
    21   }
    22 }
    可以看到泛型仍然存在于函數定義中。

    這可以說是一個Java泛型的"缺陷",實際使用中需要特別注意。
    posted on 2011-05-31 10:31 Atea 閱讀(686) 評論(0)  編輯  收藏 所屬分類: Java language
    主站蜘蛛池模板: 国产av无码专区亚洲av果冻传媒 | 亚洲成aⅴ人片在线观| 亚洲伊人久久大香线蕉| 成人免费无码H在线观看不卡| 国产精品免费看香蕉| 久久精品国产亚洲av麻豆蜜芽 | 国产一区二区三区免费观看在线| 国产成人免费片在线观看| 亚洲另类小说图片| 18禁无遮挡无码国产免费网站| 久久精品国产69国产精品亚洲| 国产免费高清69式视频在线观看| 免费一级毛片清高播放| 黄色a级片免费看| 国产一区视频在线免费观看 | 97se亚洲国产综合自在线| 国产高清免费视频| 亚洲精品中文字幕乱码影院| 最近的中文字幕大全免费8 | 曰皮全部过程视频免费国产30分钟| 亚洲成a人片在线观| 国产免费毛不卡片| 色多多免费视频观看区一区| 亚洲热线99精品视频| 18女人腿打开无遮掩免费| 亚洲熟妇无码八V在线播放| 人人狠狠综合久久亚洲高清| 黄色网站软件app在线观看免费| 一区二区三区亚洲| 国产一级淫片a视频免费观看| 青青操免费在线观看| 亚洲国产精品综合久久网各| 亚洲高清免费视频| 91av视频免费在线观看| 久久亚洲欧美国产精品| 亚洲成a人片77777kkkk| 免费看无码自慰一区二区| 在线毛片片免费观看| 亚洲成av人在线观看网站| 亚洲精品无码午夜福利中文字幕 | 亚洲成AV人片在线观看WWW|