冷面閻羅

          低調做人&&高調做事
          隨筆 - 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 冷面閻羅 閱讀(1238) 評論(0)  編輯  收藏 所屬分類: java

          主站蜘蛛池模板: 新兴县| 河池市| 资中县| 大丰市| 邓州市| 黄骅市| 石门县| 扎兰屯市| 镇康县| 苏州市| 崇阳县| 中江县| 东丰县| 巢湖市| 五指山市| 永川市| 峨眉山市| 湘乡市| 旺苍县| 蒙阴县| 集贤县| 香港| 孟州市| 扶绥县| 闸北区| 聂拉木县| 监利县| 汝州市| 宁武县| 中江县| 永济市| 汝南县| 页游| 襄樊市| 北海市| 旅游| 方正县| 和林格尔县| 黄梅县| 昌江| 中阳县|