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

avec Java Discussion :

Comprendre Boxing / Unboxing


Sujet :

avec Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2006
    Messages : 122
    Points : 114
    Points
    114
    Par défaut Comprendre Boxing / Unboxing
    Salut,

    Soit le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class Test {
       public static void main(String[] args) {
          int a = 5;
          Integer b = a;
          System.out.println(a);
          Double c = a;
          System.out.println(c);
       }
    }
    Le compilateur me retourne une erreur a la declaration de c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ javac Test.java 
    Test.java:6: incompatible types
    found   : int
    required: java.lang.Double
          Double c = a;
                     ^
    1 error
    $
    Je me disais qu'un int etant plus petit qu'un double (le primitif), il y aurait une conversion automatique en double, puis boxing pour l'assignation vers Double (l'objet). Meme apres avoir fait un cast explicit, je me retrouve avec la meme erreur:
    Seul fonctionne un cast vers le primitif avant l'assignation vers l'objet:. Quel est la regle des conversions dans ce cas et pourquoi mon raisonnement a t il echoue ?

    J'imagine que la solution est la meme que pour l'erreur suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class Test2 {
       public static void doStuff(Long a) {
          System.out.println("Value is [" + a + "]");
       }
       public static void main(String[] args) {
          int a = 5;
          doStuff(a);
       }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ javac Test2.java 
    Test2.java:7: doStuff(java.lang.Long) in Test2 cannot be applied to (int)
          doStuff(a);
          ^
    1 error
    $
    Merci de votre aide

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mars 2004
    Messages : 104
    Points : 135
    Points
    135
    Par défaut
    Salut,

    le boxing correspond à l'appel implicite du constructeur de la classe Wrapper.
    Dans le cas du Double, le constructeur prend soit un double soit un String. La phase de conversion int->double n'est pas implicite car ce sont 2 types différents (taille fixe et virgule flottante).

    Même logique pour le 2nd cas, constructeur de Long prend soit un long soit un String mais il n'y a pas la conversion de int en long qui peut être réalisée dans une affectation.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 338
    Points : 402
    Points
    402
    Par défaut
    Le Boxing permet de transformer automatiquement un type primitif vers son type wrapper.
    int ->Integer
    char ->Character
    float ->Float ...etc
    Le Unboxing c'est l'opération inverse càd type wrapper vers type primitif.
    Il n'y a pas de cast automatique comme en type primitif comme
    byte->int ,
    char ->int,
    int -> float ..etc
    Le compilateur est limité a une seule transformation en quelque sorte
    double -> Double et pas int -> double -> Double
    a++

Discussions similaires

  1. auto-boxing/unboxing sur une classe wrapper personnelle
    Par tamar_a_roulettes dans le forum Langage
    Réponses: 3
    Dernier message: 17/03/2011, 10h18
  2. Pop-up d'une dialog box a partir d'un bouton
    Par bobbyjack dans le forum MFC
    Réponses: 21
    Dernier message: 13/09/2005, 15h32
  3. Insertion dialog box dans feuille SDI
    Par Tom Joad dans le forum MFC
    Réponses: 3
    Dernier message: 12/04/2004, 00h04
  4. Réponses: 2
    Dernier message: 17/08/2003, 20h07
  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