2 回答

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))。
添加回答
舉報