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.sort
和 TreeSet
之类的东西,它们并没有针对特定类型进行硬编码,但它们必须能够在您传递给它的对象上调用 compareTo
到。这就是之前的 Comparable
接口:实现 Comparable
意味着 Collections.sort
和 TreeSet
知道您传递给它们的对象将 具有 该方法被调用。实施 Comparable
意味着您可以使用所有需要以任何方式对对象进行排序的实用程序,并且这些实用程序知道如何与您的对象进行交互。
Performance-wise,如果没有 Comparable
接口声明 compareTo()
方法存在并且可以公开调用,JVM 将不得不求助于使用反射来发现它,这将是非常昂贵。例如,JVM 将无法内联调用该方法。
因此,该接口对于编译器 (type-checking) 和运行时性能至关重要。
此外,该接口强烈表明 compareTo()
方法是 有意实施的 以比较 class 的实例,而不仅仅是一个碰巧 具有完全相同的签名但正在做完全不同的事情的方法。
最后,Comparable
接口将实现它的 classes 标记为具有 "natural comparison order"(如数字、日期...),而不是可以具有的对象equally-important 排序(例如,一个人:按年龄、体型、名字...)。
所以这也是class设计方面的重要信息。
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.sort
和 TreeSet
之类的东西,它们并没有针对特定类型进行硬编码,但它们必须能够在您传递给它的对象上调用 compareTo
到。这就是之前的 Comparable
接口:实现 Comparable
意味着 Collections.sort
和 TreeSet
知道您传递给它们的对象将 具有 该方法被调用。实施 Comparable
意味着您可以使用所有需要以任何方式对对象进行排序的实用程序,并且这些实用程序知道如何与您的对象进行交互。
Performance-wise,如果没有 Comparable
接口声明 compareTo()
方法存在并且可以公开调用,JVM 将不得不求助于使用反射来发现它,这将是非常昂贵。例如,JVM 将无法内联调用该方法。
因此,该接口对于编译器 (type-checking) 和运行时性能至关重要。
此外,该接口强烈表明 compareTo()
方法是 有意实施的 以比较 class 的实例,而不仅仅是一个碰巧 具有完全相同的签名但正在做完全不同的事情的方法。
最后,Comparable
接口将实现它的 classes 标记为具有 "natural comparison order"(如数字、日期...),而不是可以具有的对象equally-important 排序(例如,一个人:按年龄、体型、名字...)。
所以这也是class设计方面的重要信息。