【问题标题】:Necessisty of Comparable interface [closed]Comparable接口的必要性[关闭]
【发布时间】:2018-03-28 20:23:18
【问题描述】:

Comparable 接口仅包含一个方法compareTo(T o),例如Collections.sort() 方法首先将比较对象类型转换为Comparable,然后进行比较。

现在我无法理解为什么我们首先需要这个过程。直接调用对象的compareTo()方法,去掉Comparable接口不是更简单吗?如果对象没有compareTo() 方法,它无论如何都会引发错误,就像对象没有实现Comparable 接口时一样。

此外,我看不出需要Comparable 类型对象的原因。拥有Comparable 接口有什么好处吗?

【问题讨论】:

  • 如果对象没有实现 Comparable 接口,你有什么保证即使 compareTo() 方法?
  • 您是否建议Object 应该包含compareTo 方法?如果是这样,你会如何比较一个数据库和一个数据库?
  • 这个想法是在编译时检测问题,而不是在运行时检测。如果您以某种方式滥用泛型(例如使用原始类型),Collections.sort 只会在运行时抛出 ClassCastException
  • 值得指出的是Comparable 不是必要的:您可以使用兼容的Comparator 实例来代替。 Comparable 用于具有自然排序概念的类。

标签: java interface casting comparable


【解决方案1】:

如果您只是调用compareTo你自己,那么确实没有特别的理由来实现Comparable

但是对于像Collections.sortTreeSet 这样的东西,它们不是针对特定类型进行硬编码的,但是它们必须能够在您传递给它的对象上调用compareTo。这就是之前的Comparable 接口:实现Comparable 意味着Collections.sortTreeSet 知道您传递给它们的对象将拥有该方法被调用。实现Comparable 意味着您可以使用现有的所有需要​​以任何方式排序对象的实用程序,并且这些实用程序知道如何与您的对象交互。

【讨论】:

    【解决方案2】:

    此外,我看不出需要 Comparable 类型对象的原因。 拥有 Comparable 接口有什么好处吗?

    您希望 Object 如何实现 compareTo()
    提供默认工具没有任何意义。
    此外,为非常具体的需求增加Object 类的责任也不是一个好主意。
    最后,所有Object 子类都不是必需的“Comparable”。
    那么如何为他们实施呢?以UnsupportedOperationException 为例?
    它肯定会让事情变得不太清楚。

    【讨论】:

      【解决方案3】:

      性能方面,如果没有 Comparable 接口说明 compareTo() 方法存在并且可以公开调用,JVM 将不得不求助于使用反射来发现它,这将是非常代价高昂。例如,JVM 不能内联对该方法的调用。 因此,接口对于编译器(类型检查)和运行时性能至关重要。

      此外,该接口强烈表明compareTo() 方法是有意实现来比较该类的实例,而不仅仅是发生的方法有确切的签名,但做的是完全不同的事情。

      最后,Comparable 接口将实现它的类标记为具有“自然比较顺序”(如数字、日期...),而不是具有同等重要顺序的对象(例如 Person :按年龄,大小,名字...)。 所以它也是类设计方面的重要信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-01
        • 1970-01-01
        • 2011-01-14
        • 1970-01-01
        相关资源
        最近更新 更多