2 回答

TA貢獻(xiàn)1841條經(jīng)驗(yàn) 獲得超3個(gè)贊
我認(rèn)為您無(wú)法運(yùn)行此類代碼。假設(shè)你有一個(gè)抽象類:
public abstract class Number<T extends Number<T>> implements Comparable<T> {}
以及擴(kuò)展它的兩個(gè)類:
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;
}
}
然后執(zhí)行以下代碼段:
List<Number> list = new ArrayList<>();
list.add(new One());
list.add(new Two());
Collections.sort((List<Number>) list);
會(huì)拋出 ClassCastException
Exception in thread "main" java.lang.ClassCastException: comparable.One cannot be cast to comparable.Two
一般來(lái)說(shuō),您的想法違反了 compareTo 方法的約定(請(qǐng)參閱 Joshua Bloch Effective Java,第 12 條):
實(shí)現(xiàn)者必須確保所有 x 和 y 的 sgn(x.compareTo(y)) == -sgn(y.compareTo(x)) 。
實(shí)現(xiàn)者還必須確保關(guān)系是可傳遞的:(x.compareTo(y) > 0 && y.compareTo(z) > 0) 意味著 x.compareTo(z) > 0。
最后,實(shí)現(xiàn)者必須確保 x.compareTo(y) == 0 意味著 sgn(x.compareTo(z)) == sgn(y.compareTo(z)) ,對(duì)于所有 z 。
強(qiáng)烈建議但不嚴(yán)格要求 (x.compareTo(y) == 0) == (x.equals(y))。
添加回答
舉報(bào)