为了账号安全,请及时绑定邮箱和手机立即绑定

Java 比较和接口

Java 比较和接口

慕工程0101907 2021-12-10 17:00:48
假设您有 ClassA、ClassB、ClassC 和 interfaceA。ClassA 和 ClassB 实现 interfaceA,classC 包含一个 List<interface>现在假设我们将 ClassA 和 ClassB 中的一些值添加到 ClassC 列表中如果 ClassA 实现了与 ClassB 不同的可比较方法 CompareTo 会发生什么,我们调用 Collection.sort(list<interface>)哪个 CompareTo 将应用于对列表进行排序?或者我们必须在每个实现 interfaceA 的类中使用相同的 CompareTo 方法
查看完整描述

2 回答

?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

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


查看完整回答
反对 回复 2021-12-10
?
偶然的你

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))。


查看完整回答
反对 回复 2021-12-10
  • 2 回答
  • 0 关注
  • 202 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号