IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Question sur l'initialisation de wrappers


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 21
    Par défaut Question sur l'initialisation de wrappers
    Bonjour,

    J'ai le code suivant en java 1.5 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int i = 0;//OK
    short s = 0;//OK
    s = i;//erreur de compilation
    long l = 0;//OK
    Long L = 0;//erreur de compilation
    J'aimerais comprendre pourquoi ça ne compile pas ? Pourtant quand on fait "short s = 0", le 0 est un int non ?
    Je prépare ma certification java et en tombant sur ça je suis de nouveau embrouillé alors que je pensais avoir compris le chapitre sur le boxing/unboxing >_<

    Merci d'avance !

  2. #2
    Membre éprouvé Avatar de kaizokuni
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 83
    Par défaut
    Salut

    essaye ce code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                    int i = 0;//OK
    		short s = 0;//OK
    		s = (short) i;//erreur de compilation
    		long l = 0;//OK
    		long L = 0;//erreur de compilation

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 21
    Par défaut
    Merci mais je cherche à comprendre le pourquoi, en vu de ma certif', le résoudre ça je sais très bien le faire, c'est juste que je ne comprend pas le fond du problème ^^

    EDIT : @ttttnht : Je comprend pourquoi le short s = i ne passe pas, car l'autoboxing ne marche que dans le sens de plus "petit" vers plus "grand" mais alors pourquoi le short s = 0 passe lui ? Et pour le Long L = 0, pourquoi ça marche avec le long l = 0 et pas celui là ?

  4. #4
    Membre éprouvé Avatar de kaizokuni
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 83
    Par défaut
    c'est peut etre bète ce que je dit mais tu écrit Long avec L majuscule, c'est long avec l minuscule

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 268
    Par défaut
    Citation Envoyé par kaizokuni Voir le message
    c'est peut etre bète ce que je dit mais tu écrit Long avec L majuscule, c'est long avec l minuscule
    Comme tous les types primitifs, ils sont associés à une classe qui commence donc par une majuscule : Long (avec une majuscule) est donc l'objet qui correspond au type primitif long (minuscule).
    Il y a une classe par type primitif : int = Integer, boolean = Boolean, float = Float, etc ...

  6. #6
    Membre chevronné
    Inscrit en
    Juillet 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 534
    Par défaut
    Bonjour,

    Cette ligne s = i ne passe pas: ils ne sont pas de meme type.

    Il faut utiliser la conversion explicite (cast), il faut faire attention la valeur max de short.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int i = 0;//OK
    short s = 0;//OK
    s = (short)i;//OK
    Il faut ajouter L dans la ligne Long L = 0
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    long l = 0;//OK
    Long L = 0L;//erreur de compilation

  7. #7
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Citation Envoyé par Griffith Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    short s = 0;//OK
    s = i;//erreur de compilation
    J'aimerais comprendre pourquoi ça ne compile pas ? Pourtant quand on fait "short s = 0", le 0 est un int non ?
    ça ne compile pas car tu essaye de mettre un int (32 bits) dans un short (16 bits), il y a donc possibilité de perte de donnée (le compilateur ne sait pas que la valeur est 0) -> tu es obligé de caster :
    Pour la deuxième ligne, comme tu initialise avec un littéral (là le compilateur connait la valeur), le compilateur insère implicitement un cast (un littéral entier est effectivement un int). en fait c'est équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    short s = (short) 0;    // pareil que short s = 0;

    Citation Envoyé par Griffith Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Long L = 0;//erreur de compilation
    Comme je l'ai dit plus haut, les littéraux entiers sont des int. L'autoboxing le tranforme en Integer, alors que tu veux un Long.
    Pour que ça compile il te faut rajouter la lettre 'L' derrière le littéral pour indiquer au compilateur que tu veux un long et pas un int :
    Pour préparer ta certif je te recommande le bouquin "SCJP Sun Certified Programmer for Java 5 Study Guide" de Katherine Sierra et Bert Bates (ISBN 0072253606), il existe également pour la certif Java 6 (ISBN 0071591060) .
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 21
    Par défaut
    D'accord, ça répond à mes interrogations, je pensais qu'il y avait aussi de l'autoboxing entre wrappers, mais apparemment non, merci bien y@m's !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 05/08/2010, 11h05
  2. Quelques questions sur le TWebBrowser...
    Par CorO dans le forum Web & réseau
    Réponses: 3
    Dernier message: 17/01/2003, 21h23
  3. Question sur les handles et les couleurs...
    Par MrDuChnok dans le forum C++Builder
    Réponses: 7
    Dernier message: 29/10/2002, 08h45
  4. Réponses: 2
    Dernier message: 11/08/2002, 21h27
  5. question sur les message box !
    Par krown dans le forum Langage
    Réponses: 7
    Dernier message: 02/08/2002, 16h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo