Personne ne sait pourquoi java.lang.Number
ne met pas en oeuvre Comparable
? Cela signifie que vous ne pouvez pas trier Number
s avec Collections.sort
ce qui me semble un peu étrange.
Post de discussion mise à jour:
Merci pour toutes les réponses utiles. J'ai fini par faire un peu plus de recherche sur ce sujet.
L'explication la plus simple pour expliquer pourquoi java.lang.Le numéro n'est pas de mettre en œuvre Comparable est enracinée dans la mutabilité des préoccupations.
Un peu de révision, java.lang.Number
le résumé est-il super-type d' AtomicInteger
, AtomicLong
, BigDecimal
, BigInteger
, Byte
, Double
, Float
, Integer
, Long
et Short
. Sur cette liste, AtomicInteger
et AtomicLong
à ne pas mettre en oeuvre Comparable
.
Creuser autour, j'ai découvert que ce n'est pas une bonne pratique à mettre en œuvre Comparable
sur mutable types parce que les objets peuvent changer au cours de ou après comparaison rendu le résultat de la comparaison inutile. Les deux AtomicLong
et AtomicInteger
sont mutables. Les API ont eu la prévoyance de ne pas avoir Number
œuvre Comparable
, parce qu'il aurait contraint la mise en œuvre des futurs sous-types. En effet, AtomicLong
et AtomicInteger
ont été ajoutés dans Java 1.5 longtemps après, java.lang.Number
a été initialement mise en œuvre.
En dehors de la mutabilité, il y a probablement d'autres considérations trop. Un compareTo
mise en œuvre en Number
aurait pour promouvoir toutes les valeurs numériques à l' BigDecimal
parce qu'il est capable d'accueillir tous les Number
sous-types. L'implication de cette promotion en termes de mathématiques et de la performance est un peu claire pour moi, mais mon intuition constate que la solution encombrants.