猿问

Java 比较和接口

假设您有 ClassA、ClassB、ClassC 和 interfaceA。

ClassA 和 ClassB 实现 interfaceA,classC 包含一个 List<interface>

现在假设我们将 ClassA 和 ClassB 中的一些值添加到 ClassC 列表中

如果 ClassA 实现了与 ClassB 不同的可比较方法 CompareTo 会发生什么,我们调用 Collection.sort(list<interface>)

哪个 CompareTo 将应用于对列表进行排序?或者我们必须在每个实现 interfaceA 的类中使用相同的 CompareTo 方法


慕工程0101907
浏览 203回答 2
2回答

凤凰求蛊

Comparable 接口不是最好的方法。我建议使用传递给集合排序方法的比较器。

偶然的你

我认为您无法运行此类代码。假设你有一个抽象类:public abstract class Number<T extends Number<T>> implements Comparable<T> {}以及扩展它的两个类:public class One extends Number<One> {&nbsp; &nbsp; @Override&nbsp; &nbsp; public int compareTo(One o) {&nbsp; &nbsp; &nbsp; &nbsp; return -1;&nbsp; &nbsp; }}public class Two extends Number<Two> {&nbsp; &nbsp; @Override&nbsp; &nbsp; public int compareTo(Two o) {&nbsp; &nbsp; &nbsp; &nbsp; return 0;&nbsp; &nbsp; }}然后执行以下代码段:List<Number> list = new ArrayList<>();list.add(new One());list.add(new Two());Collections.sort((List<Number>) list);会抛出 ClassCastExceptionException 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))。
随时随地看视频慕课网APP

相关分类

Java
我要回答