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

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

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

    冷面閻羅

    低調做人&&高調做事
    隨筆 - 208, 文章 - 3, 評論 - 593, 引用 - 0
    數據加載中……

    泛型與數據類型轉換

    ?????????jdk6都出來有一點時間,感覺自己還是停留在jdk4的水平上,今天研究線程的時候,看到資料上的
    ?????????ExecutorService pool = Executors.newCachedThreadPool();以及class MatchCounter implements Callable<Integer> ,感覺很是奇怪.后來上網找了資料才知道是Jdk5.0新特性——Generic Types (泛型).
    ??????? 我就將我理解的大體說一下,大家學習一下.
    import?Java.util.Hashtable;?
    class?Test?{?
     ?
    public?static?void?main(String[]?args)?{?
      ?Hashtable?h?
    =?new?Hashtable();?
      ?h.put(
    "key",?"value");?
      ?String?s?
    =?(String)h.get("key");?
      ?System.out.println(s);?
     ?}
    ?
    }
    ?
    ??????這個我們做了類型轉換,是不是感覺很煩的,并且強制類型轉換會帶來潛在的危險,系統可能會拋一個ClassCastException異常信息。在JDK5.0中我們完全可以這么做,如:
    import?java.util.Hashtable;

    public?class?Test?{
    ????
    public?static?void?main(String[]?args)?{
    ????????Hashtable
    <String,?Integer>?h?=?new?Hashtable<String,?Integer>();
    ????????h.put(
    "key",?new?Integer(123));
    ????????
    int?s?=?h.get("key");
    ????????System.out.println(s);
    ????}

    }

    ??????這里我們使用泛化版本的HashMap,這樣就不用我們來編寫類型轉換的代碼了,類型轉換的過程交給編譯器來處理,是不是很方便,而且很安全。上面是String映射到String,也可以將Integer映射為String,只要寫成HashTable<Integer,String> h=new HashTable<Integer,String>();h.get(new Integer(0))返回value。果然很方便!

    ????? 從上面有沒有看到有點別扭啊,h.get(new Integer(123))這里的new Integer(123);好煩的,在JDK5.0之前我們只能忍著了,現在這種問題已經解決了,請看下面這個方法。我們傳入一個int這一基本型別,然后再將i的值直接添加到List中,其實List是不能儲存基本型別的,List中應該存儲對象,這里編譯器將int包裝成Integer,然后添加到List中去。接著我們用List.get(0);來檢索數據,并返回對象再將對象解包裝成int。恩,JDK5.0給我們帶來更多方便與安全。
    public?void?autoBoxingUnboxing(int?i)?{?
     ?ArrayList
    <Integer>?L=?new?ArrayList<Integer>();?
     ?L.add(i);?
     ?
    int?a?=?L.get(0);?
     ?System.out.println(
    "The?value?of?i?is?"?+?a);?
    }
    ?

    ??????也許你已經發現在TestGen<K,V>這個泛型類,其中K,V可以是任意的型別。也許你有時候呢想限定一下KV當然范圍,怎么做呢?看看如下的代碼:
    package?jdk5;

    public?class?TestGen2<K?extends?String,?V?extends?Number>?{
    ????
    private?V?v?=?null;

    ????
    private?K?k?=?null;

    ????
    public?void?setV(V?v)?{
    ????????
    this.v?=?v;
    ????}


    ????
    public?V?getV()?{
    ????????
    return?this.v;
    ????}


    ????
    public?void?setK(K?k)?{
    ????????
    this.k?=?k;
    ????}


    ????
    public?K?getK()?{
    ????????
    return?this.k;
    ????}


    ????
    public?static?void?main(String[]?args)?{
    ????????TestGen2
    <String,?Integer>?t2?=?new?TestGen2<String,?Integer>();
    ????????t2.setK(
    new?String("String"));
    ????????t2.setV(
    new?Integer(123));
    ????????System.out.println(t2.getK());
    ????????System.out.println(t2.getV());
    ????}

    }

    上邊K的范圍是<=String V的范圍是<=Number,注意是“<=”,對于K可以是String的,V當然也可以是Number,也可以是Integer,Float,Double,Byte等。
      這個是單一的限制,你也可以對型別多重限制,如下:?

    ?????????class C<T extends Comparable<? super T> & Serializable>
      我們來分析以下這句,T extends Comparable這個是對上限的限制,Comparable< super T>這個是下限的限制,Serializable是第2個上限。一個指定的類型參數可以具有一個或多個上限。具有多重限制的類型參數可以用于訪問它的每個限制的方法和域。

    ?

    posted on 2006-12-26 21:49 冷面閻羅 閱讀(1237) 評論(0)  編輯  收藏 所屬分類: java

    主站蜘蛛池模板: 亚洲福利一区二区| 亚洲高清视频在线观看| 亚洲AV成人影视在线观看| 一级毛片不卡片免费观看| 亚洲成av人在线视| 亚欧免费无码aⅴ在线观看| 亚洲国产天堂在线观看| 免费A级毛片无码A∨中文字幕下载| 亚洲av无码一区二区乱子伦as| 拍拍拍无挡视频免费观看1000| 精品久久久久久亚洲| 西西人体免费视频| 久久精品国产精品亚洲艾| 最近中文字幕高清免费中文字幕mv| 亚洲欧洲校园自拍都市| 成人毛片18岁女人毛片免费看| 亚洲人成人伊人成综合网无码| 国产成人免费福利网站| a高清免费毛片久久| 亚洲成a人片在线观看日本| 97性无码区免费| 国产亚洲Av综合人人澡精品| 日韩亚洲国产二区| 无码精品人妻一区二区三区免费看| 亚洲天堂一区在线| 午夜国产大片免费观看| 久久精品成人免费观看97| 久久狠狠高潮亚洲精品| 在线免费观看a级片| 国产va免费观看| 亚洲第一区视频在线观看| 永久免费AV无码网站在线观看| 另类小说亚洲色图| 国产成人亚洲精品青草天美| 一二三四免费观看在线视频中文版| 亚洲av日韩综合一区二区三区| 国产AV无码专区亚洲AV男同| 一个人看的www在线观看免费| 国产精品免费大片一区二区| 亚洲伊人久久精品| 中文亚洲AV片不卡在线观看|