可比接口的必要性

时间:2018-03-28 20:23:18

标签: java interface casting comparable

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

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

此外,我没有看到需要Comparable类型对象的原因。拥有Comparable界面有什么好处吗?

3 个答案:

答案 0 :(得分:1)

  

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

此外,界面强烈表明compareTo()方法已经实现用于比较该类的实例,而不仅仅是发生的方法拥有那个确切的签名,但却做了一些完全不同的事情。

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