Double/Double

Résolu
bibabobu Messages postés 12 Statut Membre -  
bibabobu Messages postés 12 Statut Membre -
Bonjour,

Je me pose quelques questions sur la provenance des types primitifs et comment fonctionnent les wrappers classes Double, Integer...
En outre, j'aimerais que l'on m'explique pourquoi :
double d = new Double(12.2586); // est équivalent à double d = 12.2586;

car à partir de ma connaissance des objets, je comprends:
Double d=new Double(12.2586) mais pas double d=new Double(65465);


Merci d'avance pour les réponses!

A voir également:

4 réponses

Mahmah Messages postés 497 Statut Membre 125
 
Bonjour,

Je ne suis pas forcement très connaisseur (surtout en java) mais voici mon opinion:

double d = new Double(12.2586);
n'est pas équivalent à
double d = 12.2586;

double d = 12.2586;
je pense que tout le monde voit...

double d = new Double(12.2586);
Ce code construit une instance la classe Double, puis il y a une sorte de cast implicite pour convertir le Double en double puis l'instance de Double est détruite car elle n'est référencée par aucune variable. (donc a priori beaucoup de code pour faire exactement la même chose qu'au dessus)

Apparemment c'est une "Unboxing conversion"

Je n'ai pas trouvé si le compilateur faisait effectivement cette conversion de manière implicite donc je ne peux être sûr à 100% que c'est bien elle qui est appliquée ici mais ça expliquerait assez bien ce qui se produit ici.

Bien à vous,
M.
1
bibabobu Messages postés 12 Statut Membre 1
 
merci, c'est très clair.
bonne soirée.
0
loupius Messages postés 789 Statut Membre 148
 
Gare au lézard primitif (ne lui dîtes pas il ne sera pas ravi de ce qualificatif !) !!!
double d = new Double(12.2586); // est équivalent à double d = 12.2586;
Absolument pas, il y a une erreur, il faut écrire:
double* d = new double(12.2586);
Bonne réflexion.
0
bibabobu Messages postés 12 Statut Membre 1
 
Bonne réflexion -> ah oui, tu m'étonnes.
D'après ma connaissance du C, le wildcard ou l'astérix (ou l'obélix pour ceux qui suivent) indique que la variable est de type pointeur sur double.
Cela dit, d'après ma connaissance en Java, je n'ai jamais encore vu une telle déclaration de variable.
Lorsque tu écris
double* d = new double(12.2586);

cela veut dire qu'il existe un constructeur double qui prendrait en paramètre un double. En plus, il n'existe pas de classe double mais seulement une classe Double.
Cependant, il existe des modifications suivant les versions de java et apparemment, après le java 1.4, la classe Double a changé.
Personnellement, je consulte l'API java 1.5.

Au fait, pourrais-tu m'expliquer très vite ton code?

Merci d'avance.
0
loupius Messages postés 789 Statut Membre 148
 
Oublie ce que j'ai dit, car je croyais simplement que tu exposais un problème de C++. Une croyance née d'une imprécision dans la question;
Bonne soirée.
0
bibabobu Messages postés 12 Statut Membre 1
 
I couldn't be more sorry. C'est la moindre des choses de préciser le langage.
Merci tout de même pour la réponse..
Bon W-E
0
fiddy Messages postés 11653 Statut Contributeur 1 847
 
Bonjour,

Attention Bibabobu, il s'agit d'astérisque et non d'astérix, bien que ce dernier existe ^^.
Sinon, n'oublie jamais de préciser le langage dont tu parles. Cela change beaucoup d'un langage à l'autre.
Bon j'imagine que tu parles de Java, du coup.
Je confirme les propos de Mahmah.

double d = new Double(12.2586); // est équivalent à double d = 12.2586;
Oui, c'est vrai à partir de J2SE 5.0. Normalement, il faudrait écrire :
Double wrap = new Double(12.2586);
double d = wrap.doubleValue();

C'est ce qu'on appelle l'unboxing. Il y a aussi l'autoboxing (c'est le contraire grosso modo). Cette opération est fait à la compilation (si >= J2SE 5.0).

Cdlt,
0
bibabobu Messages postés 12 Statut Membre 1
 
Qué miseria! Astérisque biensûr! Merci de signaler l'erreur. En plus, je suis moi-même trop souvent exaspérée dvt les forums informatiques où je trouve des énormes erreurs d'orthographe.
Sinon, pour le langage, pourquoi ne l'ai-je donc pas précisé?!? Dieu merci, fiddy est encore là pour me corriger.

Cdlt
0