隨筆-348  評論-598  文章-0  trackbacks-0
          請看下面兩段代碼
          interface Name extends Comparable {
            
          public int compareTo(Object o);
          }


          class SimpleName implements Name {
            
          private String base;
            
          public SimpleName(String base) {
              
          this.base = base;
            }

            
          public int compareTo(Object o) {
              
          return base.compareTo(((SimpleName)o).base);
            }

          }


          class ExtendedName extends SimpleName {
            
          private String ext;
            
          public ExtendedName(String base, String ext) {
              
          super(base); this.ext = ext;
            }

            
          public int compareTo(Object o) {
              
          int c = super.compareTo(o);
              
          if (c == 0 && o instanceof ExtendedName)
                
          return ext.compareTo(((ExtendedName)o).ext);
              
          else
                
          return c;
            }

          }


          class Client {
            
          public static void main(String[] args) {
              Name m 
          = new ExtendedName("a","b");
              Name n 
          = new ExtendedName("a","c");
              
          assert m.compareTo(n) < 0;
            }

          }



          interface Name extends Comparable<Name> {
            
          public int compareTo(Name o);
          }


          class SimpleName implements Name {
            
          private String base;
            
          public SimpleName(String base) {
              
          this.base = base;
            }

            
          public int compareTo(Name o) {
              
          return base.compareTo(((SimpleName)o).base);
            }

          }


          // use legacy class file for ExtendedName

          class Test {
            
          public static void main(String[] args) {
              Name m 
          = new ExtendedName("a","b");
              Name n 
          = new ExtendedName("a","c");
              
          assert m.compareTo(n) == 0;  // answer is now different!
            }

          }



          注意到不一樣的地方呢嗎?compareTo方法的參數(shù)不一樣。上面的代碼在調(diào)用m.compareTo(n)的時候會調(diào)用ExtendedName中的,而下面這種不會,因為ExtendedName中的compareTo參數(shù)是Object,相當(dāng)于重載了compareTo的方法,而父類SimpleName中的compareTo方法由于參數(shù)不同仍然被保留了,所以將Name類型的參數(shù)傳給compareTo的時候會優(yōu)先調(diào)用SimpleName中的compareTo(Name)來進行比較。
          所以在一些繼承里面,建議使用Object做參數(shù)的類型,稱之為Binary Compatibility。

          ---------------------------------------------------------
          專注移動開發(fā)

          Android, Windows Mobile, iPhone, J2ME, BlackBerry, Symbian
          posted on 2007-10-28 21:09 TiGERTiAN 閱讀(914) 評論(2)  編輯  收藏 所屬分類: Java

          評論:
          # re: Java Generics And Collection 學(xué)習(xí)筆記(1)[未登錄] 2007-10-29 16:45 | 劉明
          沒明白。

          首先,你的第二個的ExtendedName沒寫。這是我寫的,看是不是合你的意思。
          public class ExtendedName extends SimpleName {
          private String ext;

          public ExtendedName(String base, String ext) {
          super(base);
          this.ext = ext;
          }

          public int compareTo(Name o) {
          int c = super.compareTo(o);
          if (c == 0 && o instanceof ExtendedName) {
          return ext.compareTo(((ExtendedName)o).ext);
          } else {
          return c;
          }
          }
          }

          如果你的ExtendedName和我的一樣的話,兩個client返回的結(jié)果是一致的。-1。例如assert的話,第二個應(yīng)該也是'<'。不知道是我跟你寫的ExtendedName不一致造成的,還是其它什么問題。大家研究研究。。。  回復(fù)  更多評論
            
          # re: Java Generics And Collection 學(xué)習(xí)筆記(1) 2007-10-29 17:30 | TiGERTiAN
          上面不是有注釋嗎,ExtendedName和第一個一樣就是傳入的參數(shù)是Object不是Name,如果傳入的參數(shù)是Name那么結(jié)果就一樣了,但是如果SimpleName中傳入了Name類型,而ExtendedName中傳入了Object類型則結(jié)果是不一樣的。下面那個就是相等了。  回復(fù)  更多評論
            
          主站蜘蛛池模板: 武威市| 凌海市| 镇赉县| 吴旗县| 祁连县| 丽水市| 灵寿县| 安达市| 陆丰市| 达日县| 长岭县| 铁岭县| 舞阳县| 获嘉县| 湖北省| 江油市| 洛宁县| 登封市| 荣成市| 醴陵市| 吉水县| 西藏| 都兰县| 剑阁县| 高邑县| 华阴市| 威海市| 威宁| 田林县| 黑河市| 米脂县| 微山县| 得荣县| 静乐县| 京山县| 中江县| 甘洛县| 万州区| 云龙县| 平乐县| 九龙县|