Кто-нибудь знает, почему java.lang.Number
не реализует Comparable
? Это означает, что вы не можете сортировать Number
с Collections.sort
, который мне кажется немного странным.
Обновление для обсуждения:
Спасибо за все полезные ответы. Я закончил работу еще несколько исследований по этой теме.
Простейшее объяснение того, почему java.lang.Number не реализует Comparable, основано на проблемах мутируемости.
Для небольшого обзора java.lang.Number
представляет собой абстрактный супертип AtomicInteger
, AtomicLong
, BigDecimal
, BigInteger
, Byte
, Double
, Float
, Integer
, Long
и Short
. В этом списке AtomicInteger
и AtomicLong
не реализовать Comparable
.
Копаясь, я обнаружил, что не очень хорошая практика реализовать Comparable
в изменяемых типах, потому что объекты могут меняться во время или после сравнения, делая результат сравнения бесполезным. Оба AtomicLong
и AtomicInteger
изменяемы. Дизайнерам API было предусмотрительно не иметь Number
реализовать Comparable
, потому что это ограничило бы реализацию будущих подтипов. Действительно, AtomicLong
и AtomicInteger
были добавлены в Java 1.5 долго после того, как java.lang.Number
был первоначально реализован.
Помимо изменчивости, здесь, вероятно, есть и другие соображения. Реализация compareTo
в Number
должна была бы продвигать все числовые значения до BigDecimal
, поскольку она способна размещать все подтипы Number
. Последствия этого продвижения по математике и производительности немного неясны для меня, но моя интуиция находит, что решение kludgy.