DANCE WITH JAVA

          開發(fā)出高質(zhì)量的系統(tǒng)

          常用鏈接

          統(tǒng)計

          積分與排名

          好友之家

          最新評論

          JDK泛型中的問號(?)的用途 (泛型集合類的作為參數(shù)的時候的繼承問題)

          Jdk1.5中支持了泛型,在泛型的使用過程中經(jīng)常會遇到這樣一類問題

          類Parent
          public ? class ?Parent? {
          ?
          // your?code
          }


          類Child
          public ? class ?Child? extends ?Parent {
          // ?your?code
          }


          調(diào)用的地方

          import ?java.util.ArrayList;
          import ?java.util.List;

          import ?com.test.Child;


          public ? class ?Test? {
          ????
          public ? static ? void ?doTest(List < Parent > ?list) {
          ????????
          ????}

          ????
          public ? static ? void ?main(String[]?args) {
          ????????List
          < Parent > ?parentList? = ? new ?ArrayList < Parent > ();
          ????????List
          < Child > ?childList? = ? new ?ArrayList < Child > ();
          ????????doTest(parentList);
          ????????
          // 注意這里編譯錯誤
          ????????doTest(childList);
          ????????
          ????}

          }


          你會發(fā)現(xiàn)編譯錯誤,但是在我們的需求中Child的集合類是可以代替Parent的集合類來使用的,但是因為編譯器不認同,因為兩個集合類之間沒有直接的繼承關系。如果實現(xiàn)呢?在Jdk1.5的Source中我們找到了答案,隨便找一個帶有泛型的類,點進去可以看到泛型的定義,例如ArrayList<E>? HashMap<K,V>? 等等
          這里以ArrayList為例:注意addAll這個函數(shù)

          public ? boolean ?addAll(Collection <? ? extends ?E > ?c)? {
          ????Object[]?a?
          = ?c.toArray();
          ????????
          int ?numNew? = ?a.length;
          ????ensureCapacity(size?
          + ?numNew);?? // ?Increments?modCount
          ????????System.arraycopy(a,? 0 ,?elementData,?size,?numNew);
          ????????size?
          += ?numNew;
          ????
          return ?numNew? != ? 0 ;
          ????}

          ok,明白了,這個就是問號的作用.更改我們的函數(shù)

          import ?java.util.ArrayList;
          import ?java.util.List;

          public ? class ?Test? {
          ????????
          // 這里更改一下,利用問號解決問題?
          ???? public ? static ? void ?doTest(List <? ? extends ?Parent > ?list) {
          ????????
          ????}

          ????
          public ? static ? void ?main(String[]?args) {
          ????????List
          < Parent > ?parentList? = ? new ?ArrayList < Parent > ();
          ????????List
          < Child > ?childList? = ? new ?ArrayList < Child > ();
          ????????doTest(parentList);
          ????????
          // 注意這里編譯正確????????
          ????????doTest(childList)????}

          }



          ?

          posted on 2007-02-10 23:46 dreamstone 閱讀(8674) 評論(2)  編輯  收藏 所屬分類: jdk相關

          評論

          # re: JDK泛型中的問號(?)的用途 (泛型集合類的作為參數(shù)的時候的繼承問題) 2007-08-03 11:05 ZelluX

          原來還有這個東西,學到了,贊  回復  更多評論   

          # re: JDK泛型中的問號(?)的用途 (泛型集合類的作為參數(shù)的時候的繼承問題) 2011-06-01 17:03 cq

          謝謝,解惑了,?號是為了解決java泛型中List<String> 不是List<Object>子類,這樣關系的權宜之計。網(wǎng)上查到的資料采用類型擦除這樣的設計,是為了向前兼容,所以有了上述違法LSP原則的設計。  回復  更多評論   

          主站蜘蛛池模板: 高邮市| 涡阳县| 凉山| 茂名市| 恭城| 汉沽区| 饶阳县| 张家川| 永吉县| 鄯善县| 富阳市| 定西市| 阿鲁科尔沁旗| 枣强县| 临猗县| 阳原县| 南充市| 沁阳市| 三明市| 克拉玛依市| 棋牌| 郎溪县| 宁南县| 土默特左旗| 崇礼县| 微山县| 千阳县| 永吉县| 岱山县| 彭山县| 泸西县| 施甸县| 大兴区| 新河县| 长治县| 河间市| 宜君县| 安乡县| 青浦区| 迁安市| 沙洋县|