簡體   English   中英

Java可比和接口

[英]Java Comparable and Interface

假設您有ClassA,ClassB,ClassC和interfaceA。

ClassA和ClassB實現interfaceA,classC包含List <interface>

現在假設我們將ClassA和ClassB中的一些值添加到ClassC列表中

如果ClassA實現與ClassB不同的可比較方法CompareTo,我們將調用Collection.sort(list <interface>),會發生什么情況

哪個CompareTo將應用於對列表進行排序? 否則我們在實現interfaceA的每個類中必須具有相同的CompareTo方法

可比接口不是最佳方法。 我建議使用傳遞給Collection排序方法的Comparator。

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

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.comparToTo(y)> 0 && y.compareTo(z)> 0)意味着x.compareTo(z)> 0。
  • 最后,實現者必須確保對於所有z,x.compareTo(y)== 0意味着sgn(x.compareTo(z))== sgn(y.compareTo(z))。
  • 強烈建議(但並非嚴格要求)(x.compareTo(y)== 0)==(x.equals(y))。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM