有人知道为什么 java.lang.Number
不实现 Comparable
吗?这意味着你不能用 Collections.sort
对 Number
进行排序,这在我看来有点奇怪。
讨论后更新:
感谢所有有帮助的回答。我最后做了 关于这个话题的更多研究。
为什么 java.lang.Number 没有实现 Comparable,最简单的解释是基于可变性的考虑。
回顾一下,java.lang.Number
是 AtomicInteger
、 AtomicLong
、 BigDecimal
、 BigInteger
、 Byte
、 Double
、 Float
、 Integer
、 Long
和 AtomicInteger
0的抽象超级类型。在这个列表中,AtomicInteger
和 AtomicLong
不实现 AtomicInteger
3。
深入研究之后,我发现在可变类型上实现 Comparable
并不是一个好的实践,因为对象可能在比较期间或比较之后发生变化,从而使比较结果变得无用。AtomicLong
和 AtomicInteger
都是可变的。API 设计人员预先考虑过不让 Number
实现 Comparable
,因为这会限制未来子类型的实现。事实上,AtomicLong
和 AtomicInteger
是在最初实现 java.lang.Number
很久之后在 Java 1.5中添加的。
除了可变性,这里可能还有其他考虑因素。Number
中的 compareTo
实现必须将所有数值提升到 BigDecimal
,因为它能够容纳所有的 Number
子类型。在数学和性能方面,这种提升的含义对我来说有点不清楚,但是我的直觉认为这种解决方案是不合理的。