<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
    主站蜘蛛池模板: 成人人免费夜夜视频观看| 久久久久国产精品免费免费不卡 | 两个人看的www免费| 国产亚洲情侣一区二区无| 久久WWW免费人成—看片| 亚洲一区精品伊人久久伊人| 日韩在线视频免费| a级亚洲片精品久久久久久久| jizz免费观看视频| 久久久亚洲精品国产| 久久永久免费人妻精品下载| 自怕偷自怕亚洲精品| 日本成年免费网站| 亚洲日本天堂在线| 亚洲AV无码一区二区三区在线观看 | h在线观看视频免费网站| 亚洲&#228;v永久无码精品天堂久久| 亚洲avav天堂av在线网毛片| 国产一区二区三区无码免费| 一个人看的免费视频www在线高清动漫 | 丝袜熟女国偷自产中文字幕亚洲| 久久性生大片免费观看性| 亚洲A∨无码一区二区三区| 最近在线2018视频免费观看| 亚洲综合一区国产精品| 四虎国产精品免费久久影院| 黄色免费在线网站| 亚洲香蕉在线观看| 免费一看一级毛片全播放| 中国国语毛片免费观看视频| 亚洲妓女综合网99| 国产免费av片在线无码免费看| 久久九九免费高清视频| 亚洲日韩乱码久久久久久| 国产免费人成在线视频| 中国国语毛片免费观看视频| 亚洲一区二区三区亚瑟| 亚洲精品高清在线| 成年人网站免费视频| 免费一级做a爰片久久毛片潮| 亚洲精品国产电影午夜|