亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java 比較和接口

Java 比較和接口

慕工程0101907 2021-12-10 17:00:48
假設您有 ClassA、ClassB、ClassC 和 interfaceA。ClassA 和 ClassB 實現 interfaceA,classC 包含一個 List<interface>現在假設我們將 ClassA 和 ClassB 中的一些值添加到 ClassC 列表中如果 ClassA 實現了與 ClassB 不同的可比較方法 CompareTo 會發生什么,我們調用 Collection.sort(list<interface>)哪個 CompareTo 將應用于對列表進行排序?或者我們必須在每個實現 interfaceA 的類中使用相同的 CompareTo 方法
查看完整描述

2 回答

?
鳳凰求蠱

TA貢獻1825條經驗 獲得超4個贊

Comparable 接口不是最好的方法。我建議使用傳遞給集合排序方法的比較器。


查看完整回答
反對 回復 2021-12-10
?
偶然的你

TA貢獻1841條經驗 獲得超3個贊

我認為您無法運行此類代碼。假設你有一個抽象類:


public abstract class Number<T extends Number<T>> implements Comparable<T> {}

以及擴展它的兩個類:


public class One extends Number<One> {

    @Override

    public int compareTo(One o) {

        return -1;

    }

}


public class Two extends Number<Two> {

    @Override

    public int compareTo(Two o) {

        return 0;

    }

}

然后執行以下代碼段:


List<Number> list = new ArrayList<>();

list.add(new One());

list.add(new Two());

Collections.sort((List<Number>) list);

會拋出 ClassCastException


Exception in thread "main" java.lang.ClassCastException: comparable.One cannot be cast to comparable.Two

一般來說,您的想法違反了 compareTo 方法的約定(請參閱 Joshua Bloch Effective Java,第 12 條):


實現者必須確保所有 x 和 y 的 sgn(x.compareTo(y)) == -sgn(y.compareTo(x)) 。

實現者還必須確保關系是可傳遞的:(x.compareTo(y) > 0 && y.compareTo(z) > 0) 意味著 x.compareTo(z) > 0。

最后,實現者必須確保 x.compareTo(y) == 0 意味著 sgn(x.compareTo(z)) == sgn(y.compareTo(z)) ,對于所有 z 。

強烈建議但不嚴格要求 (x.compareTo(y) == 0) == (x.equals(y))。


查看完整回答
反對 回復 2021-12-10
  • 2 回答
  • 0 關注
  • 166 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號