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 :

conversion int -> short dans une méthode(short)


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de 0redd
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 141
    Par défaut conversion int -> short dans une méthode(short)
    Bonsoir
    Pourquoi l'entier 5 peut être implicitement converti en short dans ce cas
    mais pas dans celui là ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void afficher(short i) { ... }
    public static void main(String[] Args) {
        afficher(5);
    }
    Merci d'avance

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Ce n'est pas une question de conversion, en fait.

    5 est un littéral numérique. En tant que tel, il peut être considéré comme un byte, un short, un int, un long, un char, un float ou un double. Il n'est même pas converti, il est n'importe lequel de ces types.

    Toutefois, le fait qu'il puisse être n'importe lequel de tous ces types crée une ambiguïté dans le cas d'un appel de méthode.
    Supposons que tu aies aussi une méthode afficher(int i). Dans ce cas, en appelant afficher(5), comment le compilateur doit-il choisir entre afficher(int i) et afficher(short i) ?
    Eh bien, il le fait en considérant que dans un appel de méthode, les littéraux numériques de cette forme ne peuvent être que des int. Donc pour un short, byte, ou char, il faut expliciter leur type. Avec un cast, ou alors d'abord déclarer une variable de ce type, lui assigner la valeur, et appeler la méthode avec cette variable.

    Dans une instruction d'assignation, le problème ne se pose pas : on sait quel doit être le type de 5 en regardant le type de la variable assignée.

    Ce qui peut se redire autrement :
    5 est une expression numérique littérale, de type int dans les conditions de typage ambiguës, et de type byte, short, int, long, char, float ou double dans les conditions de typage déterministes.

    Un truc qui peut aider à comprendre : il se passe quoi en faisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    byte b1 = 5;
    byte b2 = 256;
    ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre confirmé Avatar de 0redd
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 141
    Par défaut
    Merci pour votre réponse thelvin,
    j'ai lus dans un bouquin que :
    byte b = 27; est traduite par le compilateur en byte b = (byte)27;
    j'ai compris que ça passe quand il n'y a pas de pertes d'infos, (vu que 27 peut tenir dans un byte).
    Ceci dit, si j'avais mis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int i = 27;
    byte b = i;
    cela ne marchera pas, même si 27 peut tenir sans problème dans un byte, comme si le compilateur ne cherché pas a connaitre la valeur de i
    j'avais pensé que quand j'appelais afficher(5); il y' avais peut être une variable int qui se créé automatiquement et qui contenait la valeur 5, et dont on reviens a passé un variable int a un byte, donc le cast est nécessaire.
    non?

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par 0redd Voir le message
    cela ne marchera pas, même si 27 peut tenir sans problème dans un byte, comme si le compilateur ne cherché pas a connaitre la valeur de i
    Justement, le compilateur ne cherche pas à le savoir, c'est pas du tout son rôle. Là, i vient de l'instruction du dessus, qui est une expression constante, donc le compilateur pourrait inférer sa valeur et voir que ça passe dans un byte. Mais par cohérence avec le cas général, il ne le fait pas. Dans le cas général, la valeur de i est inconnue du compilateur.

    Citation Envoyé par 0redd Voir le message
    j'avais pensé que quand j'appelais afficher(5); il y' avais peut être une variable int qui se créé automatiquement et qui contenait la valeur 5, et dont on reviens a passé un variable int a un byte, donc le cast est nécessaire.
    non?
    Nieh ? Pas tout compris.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre confirmé Avatar de 0redd
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 141
    Par défaut
    j'ai commis une erreur de frape donc à la place de dont;
    c'est juste ce que j'avais compris, bon voilà:
    le compilateur créera en interne une variable disons parametre1 de type int qui contient 5; ça serai quelque chose du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    parametre1 = 5;
    afficher(parametre1);
    et on a la méthode qui accepte un byte, et donc impossible de convertir depuis : parametre1 à i (une variable de type int en byte) ,ça serai plutôt pareil à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int i = 27;
    byte b = i;
    je sais pas si c'est clair ce que je dit ..

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Ma foi, c'est comme ça que le langage est défini.

    Se rappeler toutefois que les expressions constantes de type int, peuvent être assignées à des places d'autres types, du moment que la valeur de l'expression constante est dans l'intervalle du type de la place.
    Et qu'un paramètre d'appel de méthode n'est pas considéré comme une place.

    Bref, qu'on peut faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    byte b = 5;
    byte[] array1 = new byte[1];
    array1[0] = 5;
    byte[] array2 = {5, 6, 7};
    mais pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void traiter(byte b) { }
    
    void do() {
      traiter(5);
    }
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. [Débutant] Problème de conversion et retour dans une méthode
    Par darkepsylon dans le forum C#
    Réponses: 3
    Dernier message: 19/01/2015, 13h04
  2. passer la valeur d'un return dans une méthode
    Par belukrin dans le forum Langage
    Réponses: 1
    Dernier message: 25/03/2006, 06h58
  3. instanciation problématique dans une méthode ActiveX
    Par mr.saucisse dans le forum MFC
    Réponses: 14
    Dernier message: 17/01/2006, 16h34
  4. Erreur de conversion et requête dynamique dans une procédure
    Par franculo_caoulene dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 01/08/2005, 15h12
  5. Réponses: 2
    Dernier message: 15/11/2004, 15h12

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