[英]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.