Кто-нибудь знает, почему 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.
