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 :

[jdk5.0][ellipse] quelques questions


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Par défaut [jdk5.0][ellipse] quelques questions
    Bonjour,
    Je me pose des questions sur l'ellipse.
    Voici un code juste pour baser le debat.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    import java.util.List;
    import java.util.LinkedList;
     
    public class MyCollection
    {
    	private List<MyObject> myObjects = new LinkedList<MyObject>();
     
    	public void add(MyObject o){ myObjects.add(o); }
     
    	/* // deja defini par l'ellipse
    	public void add(MyObject[] os){
    		for(MyObject o : os){ myObjects.add(o); }
    	}
    	*/
     
    	public void add(MyObject... os){
    		for(MyObject o : os){ myObjects.add(o); }
    	}
     
    }
     
    class MyObject {}
    Comment la jvm peut elle faire la difference entre la premiere version de add et la derniere quand on ne passe qu'un object en parametre?

    Et une autre question theorique mais qui ne servira pas (ou presque pas dans la pratique), si on declare
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public void add(Object... os)
    les appels
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    add(new Object[1],new Object[2]) // os contient ces deux tableaux
    add(new Object[6]) // os = le tableau créé
    sont clairs
    Cela implique qu'il est impossible que os soit de taille 1 et contenant une reference vers un tableau, non?
    mais ne peux determiner quelle methode appeler, non?
    Est ce que est accepté?

    Merci d'avance

    Remarque : Ce n'est pas la peine de me dire d'aller lire quelquechose sur ce forum, j'ai lu tout ce qui était en raport, mon code est juste une base pour des questions donc oui il ne sert pas à grand chose... Et je precise aussi, actuellement je ne dispose pas de jdk installé sur l'ordinateur que j'utilise...

  2. #2
    Expert confirmé


    Profil pro
    Inscrit en
    Mai 2003
    Messages
    3 240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 3 240
    Par défaut Re: [jdk5.0][ellipse] quelques questions
    Citation Envoyé par TabrisLeFol
    Remarque : Ce n'est pas la peine de me dire d'aller lire quelquechose sur ce forum, j'ai lu tout ce qui était en raport, mon code est juste une base pour des questions donc oui il ne sert pas à grand chose... Et je precise aussi, actuellement je ne dispose pas de jdk installé sur l'ordinateur que j'utilise...
    Je ne te dirai pas d'aller lire quelque chise sur ce forum, mais sur mon blog. Tu y apprendra qu'il est possible d'exécuter du code comme celui que tu as mis en exemple, sans avoir de JDK installé sur sa machine.

    Comment la jvm peut elle faire la difference entre la premiere version de add et la derniere quand on ne passe qu'un object en parametre?
    La JVM donnera toujours priorité à la méthode ayant la signature la plus proche. Aussi, si un seul argument est passé, il donnera priorité à la méthode qui n'attend qu'un seul argument.

    Jette un oeil sur le défi que je viens d'écrire aujourd'hui, justement. Il n'y a pas encore la réponse avec l'explication, mais cela viendra sûrement la semaine prochaine.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Par défaut
    J'attends avec impatience une reponse detaillée....

    Je n'ai pas encore regardé Zamples mais si ça tiens ses promesses, c'est super.

    Merci!!!

    EDIT : En fait aucun mot ne peut decrire Zample suffisament. Je suis meme surpris par la vitesse... Mais je sais pas si/comment je peux sauvgarder mon code si c'est possible...

  4. #4
    Expert confirmé


    Profil pro
    Inscrit en
    Mai 2003
    Messages
    3 240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 3 240
    Par défaut
    Citation Envoyé par TabrisLeFol
    J'attends avec impatience une reponse detaillée....
    Voici, si tu ne peux vraiment pas attendre, la réponse très technique, extrait du Java Language Specification.
    Bon courage.
    http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.12.2.5

    P.S. Un autre truc qui n'a rien à voir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    public class x {
      static void method(int i) {
       System.out.println("version1");
     }
      static void method(Integer i) {
      System.out.println("version2");
     }
     
     public static void main(String[] args) {
       int i = 5;
       Integer j = 10;
       method(i+j);//Appel 1
       method(j+i);//Appel 2
     }
    }
    Quelle version de méthode sera appelée ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    public class x {
      static void method(int i, Integer j) {
       System.out.println("version1");
     }
      static void method(Integer i, int j) {
      System.out.println("version2");
     }
     
     public static void main(String[] args) {
       int i = 5;
       Integer j = 10;
       method(i, j);//Appel 1
       method(j, i);//Appel 2
       method(i, i);//Appel 3
       method(j, j);//Appel 4
     }
    }
    Quelle est le résultat de chaque appel et pourquoi ?

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Par défaut
    Je comprends le probleme du fait de l'auto boxing mais je connais pas les prioritées...

    La page de sun est peut etre la solutions mais l'explication d'un algorithme en anglais....

    Sais tu comment je sauvegarde mon code sur Zample?

    Edit pour le premier exemple, le calcul ce fait avec des types primitifs. Je repondrais donc la version 1 pour les deux mais il est egalement possible que si le premier element est un Integer le compilateur s'amuse a re wraper en fonction du premier "type" rencontrer dans le calcul...

    Pour le second code, c'est une question de priorité mais je ne vois vraiment pas....
    Je dirais 1 2 1 2 si il cherche d'abord à verifier le premier parametre....

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 882
    Par défaut
    Citation Envoyé par vbrabant
    Citation Envoyé par TabrisLeFol
    J'attends avec impatience une reponse detaillée....
    Voici, si tu ne peux vraiment pas attendre, la réponse très technique, extrait du Java Language Specification.
    Bon courage.
    http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.12.2.5

    P.S. Un autre truc qui n'a rien à voir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    public class x {
      static void method(int i) {
       System.out.println("version1");
     }
      static void method(Integer i) {
      System.out.println("version2");
     }
     
     public static void main(String[] args) {
       int i = 5;
       Integer j = 10;
       method(i+j);//Appel 1
       method(j+i);//Appel 2
     }
    }
    Quelle version de méthode sera appelée ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    public class x {
      static void method(int i, Integer j) {
       System.out.println("version1");
     }
      static void method(Integer i, int j) {
      System.out.println("version2");
     }
     
     public static void main(String[] args) {
       int i = 5;
       Integer j = 10;
       method(i, j);//Appel 1
       method(j, i);//Appel 2
       method(i, i);//Appel 3
       method(j, j);//Appel 4
     }
    }
    Quelle est le résultat de chaque appel et pourquoi ?
    Bon je repond au premier code (l autre je le laisse aux autres)
    lors de l utilisation de l operateur + binaire, les "arithmetic promotion" s operent....

    - Dans le cas present l integer est transforme en int via l autoboxing
    - une addition entre deux int donne un resultat de type int

    => la methode apellee est celle avec un int en parametre
    C est simple non

  7. #7
    Expert confirmé


    Profil pro
    Inscrit en
    Mai 2003
    Messages
    3 240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 3 240
    Par défaut
    Citation Envoyé par SEMPERE Benjamin
    C est simple non
    Oui, mais t'es déjà certifié. C'est pour cette raison que cela te paraît simple !!!
    En fait, le gros avantage de la certification, c'est qu'on doit étudier Java pour la passer et la réussir. Et donc connaitre les petits détails comme cela qui nous sauvent quelque fois la vie.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Par défaut
    Et pour la seconde?
    Une des priorité du compilateur est de fournir le "moins d'effort" pour trouver la fonction à utiliser.
    Le fait de passer de primitif à Objet ou l'inverse peut donc jouer. C'est vrai que, autant pour la premiere j'etais a peu pres sur, sauf comportement bizare du compilateur... Autant la seconde.. je peux rien affirmer avec certitude.

  9. #9
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 882
    Par défaut
    Citation Envoyé par vbrabant
    Citation Envoyé par SEMPERE Benjamin
    C est simple non
    Oui, mais t'es déjà certifié. C'est pour cette raison que cela te paraît simple !!!
    En fait, le gros avantage de la certification, c'est qu'on doit étudier Java pour la passer et la réussir. Et donc connaitre les petits détails comme cela qui nous sauvent quelque fois la vie.
    bien sur vincent je suis d accord mais c vrai que j ai pas mal bouquiner pour ca ne te vexe surtout pas, je te taquine

  10. #10
    Expert confirmé


    Profil pro
    Inscrit en
    Mai 2003
    Messages
    3 240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 3 240
    Par défaut
    Citation Envoyé par TabrisLeFol
    Sais tu comment je sauvegarde mon code sur Zample?
    Pas possible de sauver son code sous Zample. Pas fait pour cela.
    En fait Zample est fait pour tester de miniscule bout de code que tu as copié d'ailleurs. Donc, Copier Coller dans NotePad, et tu sauves en local.
    [/quote]
    Citation Envoyé par TabrisLeFol
    Edit pour le premier exemple, le calcul ce fait avec des types primitifs. Je repondrais donc la version 1 pour les deux mais il est egalement possible que si le premier element est un Integer le compilateur s'amuse a re wraper en fonction du premier "type" rencontrer dans le calcul...
    Non, il ne fait pas cela. Du fait qu'il y a addition, il transforme en primitif (donc int). Le résultat de l'addition est un int. Il cherche la méthode ayant la signature avec int. Il trouve la première et voilà.
    Citation Envoyé par TabrisLeFol
    Pour le second code, c'est une question de priorité mais je ne vois vraiment pas....
    Je dirais 1 2 1 2 si il cherche d'abord à verifier le premier parametre....
    Pour les deux premiers, c'est pas compliqué. Comme il trouve la méthode ayant exactement la même signature, c'est bon. Il prend celle la.
    Pour les deux suivants (method(i, i) et method(j, j), il donne une erreur de compilation. Car il y a ambiguité. Il est en effet obligé de faire une transformation. Soit le 1er argument. Soit le deuxième. Lequel choisir. Le compilateur donne une erreur d'ambiguité. Pour que le développeur leve l'ambiguité. Maintenant, si on avait un truc du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       method(j, null);
       method(null, j);
    Il n'y a plus d'ambiguité. null ne peut représenter qu'un objet. et donc il sait que c'est le 1er argument qu'il doit transformer en int dans le 1er cas, ou le deuxième argument qu'il doit transformer en int dans le 2ième cas. Et là, ca passe à la compilation.

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Par défaut
    ambiguitée,
    ah oui j'avais pas considéré que ça pouvait exister donc c'est moi qui ne savais laquelle choisir...

    ok merci

    Resolution : add(new Object[0]) et add() sont acceptés
    En fait c'est logique...

Discussions similaires

  1. Quelques question sur Win 32 Appli
    Par lvdnono dans le forum Windows
    Réponses: 5
    Dernier message: 15/06/2004, 13h37
  2. [Débutant]Quelques questions de principe sur l'API win32
    Par silver_dragoon dans le forum Windows
    Réponses: 4
    Dernier message: 19/03/2004, 19h38
  3. [install]Install sous windows... quelques questions
    Par omega dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 26/02/2004, 10h50
  4. [MFC] Quelques questions de débutant...
    Par Sephi dans le forum MFC
    Réponses: 4
    Dernier message: 20/02/2004, 18h25
  5. Quelques questions sur le TWebBrowser...
    Par CorO dans le forum Web & réseau
    Réponses: 3
    Dernier message: 17/01/2003, 22h23

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