Java: plusieurs façons de lancer un objet (long) en double
J'ai un Object obj
que je sais, c'est en fait un long
.
Dans certains code Mathématique j'ai besoin d'elle comme double
.
Est-il sécuritaire de directement convertir en double?
double x = (double)obj;
Ou devrais-je plutôt cast-le d'abord et puis d'un double.
double x = (double)(long)obj;
J'ai aussi trouvé un autre (moins lisible) alternative:
double x = new Long((long)obj).doubleValue();
Quels sont les dangers et les répercussions de le faire?
Résumé De La Solution:
obj
est unNumber
et pas unlong
.- Java 6 nécessite une conversion explicite, par exemple:
double x = ((Number)obj).doubleValue()
- Java 7 a de travail de la fonte de la magie:
double x = (long)obj
Pour plus de détails sur la Java6/7 question également lire les discussions de TJ répondre.
Edit: j'ai fait quelques tests rapides. Les deux moyens de moulage (explicite/magie) ont le même rendement.
source d'informationauteur Juve
Vous devez vous connecter pour publier un commentaire.
Comme tous les primitifs nombre de Java est rejeté à son boxe type lorsqu'un objet est nécessaire (dans notre cas
Long
) et chaque numéro de boîte est une instance deNumber
le plus sûr moyen de le faire est:Le danger ici est, comme toujours, que le
Object
nous voulons fonte n'est pas de typeNumber
dans ce cas, vous obtiendrez unClassCastException
. Vous pouvez vérifier le type de l'objet commesi vous voulez éviter de classe fonte des exceptions et, au lieu de fournir une valeur par défaut comme
0.0
. Aussi silencieusement à défaut de méthodes ne sont pas toujours une bonne idée.Non, vous ne le font pas.
long
est un type de données primitif, et les types primitifs de Java ne sont pas des objets. Noter qu'il y a une différence entre le type primitiflong
etjava.lang.Long
qui est une classe wrapper.Vous ne pouvez pas convertir un
Long
(objet) à unelong
(primitive). Pour obtenir lelong
valeur d'unLong
appellongValue()
:Si c'est réellement une primitive
long
alors oui, vous pouvez l'appliquer à undouble
. Si c'est unLong
objet, vous n'avez pas besoin de cast, vous pouvez les appelerdoubleValue()
:Simple casting devrait fonctionner parfaitement bien. Ce sera plus rapide que de passer par les classes wrapper, l'obtention de représentation de chaîne, puis l'analyse de double, de créer une nouvelle instance, en utilisant à nouveau le long de la valeur - et plus important encore, c'est plus lisible.
Vous pouvez le convertir en un
Long
(depuis leObject
est pas unlong
mais unLong
), puis coulé leLong
à undouble
:Par exemple, cela a la sortie attendue de 2.6666666666666665:
Vous avez seulement besoin d'une fonte, de l'Objet au Long ou Long (ce qui implicitement jette à Long applique ensuite unboxing):