Comparable接口的必要性

Necessisty of Comparable interface

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

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

此外,我看不出需要 Comparable 类型对象的理由。使用 Comparable 接口有什么好处吗?

Besides I don't see a reason one would need a Comparable type object. Is there any advantages of having a Comparable interface ?

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

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

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

Performance-wise,如果没有 Comparable 接口声明 compareTo() 方法存在并且可以公开调用,JVM 将不得不求助于使用反射来发现它,这将是非常昂贵。例如,JVM 将无法内联调用该方法。 因此,该接口对于编译器 (type-checking) 和运行时性能至关重要。

此外,该接口强烈表明 compareTo() 方法是 有意实施的 以比较 class 的实例,而不仅仅是一个碰巧 具有完全相同的签名但正在做完全不同的事情的方法。

最后,Comparable 接口将实现它的 classes 标记为具有 "natural comparison order"(如数字、日期...),而不是可以具有的对象equally-important 排序(例如,一个人:按年龄、体型、名字...)。 所以这也是class设计方面的重要信息。