Comparable接口只包含一个方法compareTo(T o)
,例如Collections.sort()
方法首先将比较对象类型转换为Comparable
,然后进行比较。
现在我无法理解为什么我们首先需要这个过程。直接调用对象的compareTo()
方法并摆脱Comparable
接口不是更简单吗?如果对象没有compareTo()
方法,则无论如何都会引发错误,就像对象没有实现Comparable
接口一样。
此外,我没有看到需要Comparable
类型对象的原因。拥有Comparable
界面有什么好处吗?
答案 0 :(得分:1)
此外,我没有看到需要Comparable类型对象的原因。 拥有Comparable接口有什么好处吗?
您希望Object
如何实施compareTo()
?
提供默认工具毫无意义
此外,增加Object
课程对非常具体的要求的责任也不是一个好主意
最后,所有Object
子类都不是必需的“Comparable
”
那么如何为他们实现呢?以UnsupportedOperationException
为例?
它最终会使事情变得不那么清楚。
答案 1 :(得分:1)
如果您只是自己致电compareTo
,那么确实没有特别的理由来实施Comparable
。
但是对于Collections.sort
和TreeSet
之类的内容,这些内容并非针对特定类型进行硬编码,但他们必须能够在传递给它的对象上调用compareTo
。这就是Comparable
界面之前的内容:实现Comparable
意味着Collections.sort
和TreeSet
知道您传递的对象将拥有该方法叫做。实现Comparable
意味着您可以使用所有需要以任何方式对对象进行排序的实用程序,并且这些实用程序知道如何与对象进行交互。
答案 2 :(得分:0)
在性能方面,没有Comparable
接口声明compareTo()
方法存在且可公开调用,JVM将不得不求助于使用反射来发现它,这将非常 代价高昂。例如,JVM无法内联对该方法的调用。
因此,接口对于编译器(类型检查)和运行时性能至关重要。
此外,界面强烈表明compareTo()
方法已经实现用于比较该类的实例,而不仅仅是发生的方法拥有那个确切的签名,但却做了一些完全不同的事情。
最后,Comparable
接口将实现它的类标记为具有"自然比较顺序" (如数字,日期......),而不是具有同等重要顺序的对象(例如,一个人:按年龄,大小,名字......)。
所以它在课堂设计方面也是一个重要的信息。