<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

    主站蜘蛛池模板: 亚洲sss综合天堂久久久| 亚洲熟妇av一区| 日日躁狠狠躁狠狠爱免费视频| 日本成年免费网站| 亚洲入口无毒网址你懂的| 57pao国产成永久免费视频| 久久亚洲日韩看片无码| 8x8x华人永久免费视频| 91天堂素人精品系列全集亚洲| 99国产精品视频免费观看| 亚洲色四在线视频观看| 91福利视频免费观看| 亚洲天堂一区二区三区| 成人免费a级毛片| 韩国亚洲伊人久久综合影院| 免费A级毛片在线播放不收费| 日本一区二区三区在线视频观看免费| vvvv99日韩精品亚洲| 精品国产一区二区三区免费| 亚洲AV无码乱码在线观看裸奔| 最近2019中文字幕免费直播| 亚洲免费福利在线视频| 国产美女无遮挡免费视频网站| 黄色三级三级免费看| 亚洲AV综合色区无码一区爱AV| 亚洲日本在线免费观看| 亚洲欧美日韩一区二区三区在线| 免费乱码中文字幕网站| 在线观看人成视频免费无遮挡| 亚洲人成电影亚洲人成9999网 | 亚洲国产系列一区二区三区 | 国产精品极品美女免费观看| 成年大片免费高清在线看黄| 亚洲国产另类久久久精品| 日本免费一区二区在线观看| 在线精品自拍亚洲第一区| 亚洲午夜福利AV一区二区无码| 亚色九九九全国免费视频| 日韩亚洲人成在线综合| 亚洲AV无码一区东京热| 四虎永久在线免费观看|