<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-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)來進(jìn)行比較。
    所以在一些繼承里面,建議使用Object做參數(shù)的類型,稱之為Binary Compatibility。

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

    Android, Windows Mobile, iPhone, J2ME, BlackBerry, Symbian
    posted on 2007-10-28 21:09 TiGERTiAN 閱讀(913) 評論(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ù)  更多評論
      
    主站蜘蛛池模板: 国产成人精品日本亚洲语音| 国产高清免费观看| 国产裸体美女永久免费无遮挡| 亚洲va在线va天堂成人| 亚洲伦另类中文字幕| 红杏亚洲影院一区二区三区| 在线观看视频免费国语| 免费在线观看视频网站| 老汉精品免费AV在线播放| 中文字幕不卡免费视频| 四虎影视永久在线精品免费| 亚洲a无码综合a国产av中文| 中文日韩亚洲欧美制服| 亚洲最新中文字幕| 久久亚洲春色中文字幕久久久| 亚洲人成在线播放网站| 久久综合亚洲色HEZYO国产| 亚洲成?v人片天堂网无码| 日本一道一区二区免费看| 德国女人一级毛片免费| 最近中文字幕mv免费高清电影| 日韩视频在线精品视频免费观看| 91精品视频在线免费观看| 91精品国产免费网站| 永久免费视频网站在线观看| 久久不见久久见免费视频7| 午夜精品免费在线观看| 久久免费国产视频| 久久久久免费看成人影片| 91短视频在线免费观看| 最近最新高清免费中文字幕| 30岁的女人韩剧免费观看| 99精品视频在线观看免费播放 | 免费无码又爽又高潮视频| 日韩免费无码一区二区视频| 国产男女猛烈无遮挡免费视频网站 | 日韩高清免费在线观看| 国产午夜免费福利红片| 亚洲成人一区二区| 国产gv天堂亚洲国产gv刚刚碰| 国产亚洲精品美女久久久|