<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
    主站蜘蛛池模板: 无码国产亚洲日韩国精品视频一区二区三区| 99久热只有精品视频免费观看17| 在人线av无码免费高潮喷水| 亚洲精品自产拍在线观看动漫| 国产精品免费无遮挡无码永久视频| 亚洲AV中文无码乱人伦下载| 无码一区二区三区免费| 亚洲AV本道一区二区三区四区 | 免费一级毛片在播放视频| 色婷婷六月亚洲综合香蕉| 免费看一级做a爰片久久| 日韩成人精品日本亚洲| 相泽亚洲一区中文字幕| 久久久精品午夜免费不卡| 夜夜亚洲天天久久| 无码国产精品一区二区免费I6| 亚洲精品美女久久久久久久| 亚洲国产精品毛片av不卡在线| 成人免费观看男女羞羞视频| 国产亚洲成av人片在线观看| 91精品免费久久久久久久久| 亚洲色图激情文学| 免费一级毛片不卡在线播放| 久久久久久免费一区二区三区| 亚洲乱码在线播放| 免费人成在线观看网站视频 | 免费国产在线精品一区| 亚洲欭美日韩颜射在线二| 中文字幕视频免费| 亚洲欧美国产精品专区久久| 黑人大战亚洲人精品一区| 2019中文字幕在线电影免费 | 中文永久免费观看网站| 亚洲另类春色校园小说| 四虎永久免费网站免费观看| 日本一区午夜艳熟免费| 亚洲中文无码永久免| 亚洲精品无码av人在线观看| 在线观看免费人成视频色9| 深夜福利在线视频免费| 亚洲图片激情小说|