【发布时间】:2009-01-26 17:32:52
【问题描述】:
有谁知道为什么java.lang.Number 没有实现Comparable?这意味着你不能用Collections.sort 对Numbers 进行排序,这在我看来有点奇怪。
发布讨论更新:
感谢所有有用的回复。我最终做了some more research about this topic。
为什么 java.lang.Number 没有实现 Comparable 的最简单解释是出于对可变性的担忧。
回顾一下,java.lang.Number 是AtomicInteger、AtomicLong、BigDecimal、BigInteger、Byte、Byte、Double、Float、Integer 的抽象超类型、Long 和 Short。在该列表中,AtomicInteger 和 AtomicLong 不实现 Comparable。
四处挖掘,我发现在可变类型上实现Comparable 不是一个好习惯,因为在比较期间或之后对象可能会发生变化,从而使比较结果变得无用。 AtomicLong 和 AtomicInteger 都是可变的。 API 设计者有先见之明,不要让Number 实现Comparable,因为它会限制未来子类型的实现。事实上,AtomicLong 和 AtomicInteger 是在 java.lang.Number 最初实现很久之后才添加到 Java 1.5 中的。
除了可变性之外,这里可能还有其他考虑因素。 Number 中的 compareTo 实现必须将所有数值提升为 BigDecimal,因为它能够容纳所有 Number 子类型。这个提升在数学和性能方面的含义对我来说有点不清楚,但我的直觉发现这个解决方案很笨拙。
【问题讨论】:
-
顺便提一下:比较两个任意数字可能是一个无穷无尽的操作。见stackoverflow.com/questions/12561485/…
标签: java sorting comparable