DANCE WITH JAVA

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

          常用鏈接

          統(tǒng)計(jì)

          積分與排名

          好友之家

          最新評論

          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的集合類來使用的,但是因?yàn)榫幾g器不認(rèn)同,因?yàn)閮蓚€集合類之間沒有直接的繼承關(guān)系。如果實(shí)現(xiàn)呢?在Jdk1.5的Source中我們找到了答案,隨便找一個帶有泛型的類,點(diǎn)進(jìn)去可以看到泛型的定義,例如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 閱讀(8681) 評論(2)  編輯  收藏 所屬分類: jdk相關(guān)

          評論

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

          原來還有這個東西,學(xué)到了,贊  回復(fù)  更多評論   

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

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

          主站蜘蛛池模板: 凭祥市| 吐鲁番市| 泗阳县| 明溪县| 淮滨县| 山东省| 新和县| 鄂伦春自治旗| 怀集县| 阜新| 铁岭县| 静安区| 仙桃市| 永川市| 阜康市| 石景山区| 肥东县| 冷水江市| 尉犁县| 丹凤县| 嘉峪关市| 镶黄旗| 城市| 花莲市| 开鲁县| 景东| 观塘区| 西青区| 资阳市| 南雄市| 上虞市| 永年县| 绥德县| 休宁县| 仲巴县| 大名县| 涡阳县| 平武县| 汉中市| 潞城市| 抚顺县|