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))。
添加回答
举报
