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 :

La référence d une méthode d'instance d'un objet arbitraire d'un type particulier (Java 8)


Sujet :

avec Java

  1. #1
    Débutant  
    Inscrit en
    Mai 2006
    Messages
    705
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 705
    Points : 117
    Points
    117
    Par défaut La référence d une méthode d'instance d'un objet arbitraire d'un type particulier (Java 8)
    Bonsoir,

    J'ai le code suivant de la classe Joueur

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
     
    package edu.java8.tools;
     
    /**
     *
     * @author House
     */
    public class Joueur {
       private int num;
       private String nom;
     
        public Joueur() {
        }
     
        public Joueur(Integer num) {
            this.num = num;
        }
     
        public Joueur(int num, String nom) {
            this.num = num;
            this.nom = nom;
        }
     
     
     
        public Integer getNum() {
            return num;
        }
     
        public void setNum(Integer num) {
            this.num = num;
        }
     
        @Override
        public String toString() {
            return "Joueur{" + "num=" + num + ", nom=" + nom + '}';
        }
     
        public String getNom() {
            return nom;
        }
     
        public void setNom(String nom) {
            this.nom = nom;
        }
     
     
        public int comp(Joueur o1, Joueur o2) {
            return o1.getNom().compareTo(o2.getNom());
        }
     
         public int comp2(Joueur o1) {
            return this.getNum() - o1.getNum();
        }
     
        public static int compareJoueur(Joueur o1, Joueur o2) {
            return o1.getNum() - o2.getNum();
        }
     
    }
    et j'ai une autre classe qui contient la méthode main():

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public static void main(String[] args) {
     Joueur[] team = new Joueur[3];
            Joueur j1 = new Joueur(24);
            Joueur j2 = new Joueur(7);
            Joueur j3 = new Joueur(11);
     
            team[0]= j1;
            team[1]= j2;
            team[2]= j3;
     
    }
    dans la classe main, j'ai voulu trié mes éléments qui se trouvent dans le tableau team en utlisant

    1- la référence vers une méthode d'instance

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Arrays.sort(team,j2::comp);  //ca fonctionne parfaitement
    2- la référence vers une méthode de classe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Arrays.sort(team,Joueur::compareJoueur); //ca fonctionne parfaitement
    3- Mais quand j'ai voulu tester une référence d une méthode d'instance d'un objet arbitraire d'un type particulier comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Arrays.sort(team,Joueur::compare); //Ca ne fonctionne pas
    alors que la méthode compare prend 2 paramètres et renvoie un int... C'est similaire à la méthode compare de l'interface fonctionnelle Comparator que prend Arrays.sort( team, Comparator<Joueur>)

    En notant que le code suivant fonctionne parfaitement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Arrays.sort(team,Joueur::comp2); //Good
    1)- Ma première question est: pourquoi ma troisième manière ne fonctionne pas!
    2)- Ma deuxième question est: Dans quel cas, je peux invoquer une méthode d'instance en utilisant le nom de la classe avec l'opérateur de résolution de portée :: ?

    J'espère que mes questions sont claires et merci pour votre aide en avance

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Hello,

    ta classe n'a pas de méthode compare(), tu sais...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Débutant  
    Inscrit en
    Mai 2006
    Messages
    705
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 705
    Points : 117
    Points
    117
    Par défaut
    Bonjour,

    Vous avez raison, j'ai oublié de la mettre dans mon premier code (classe Joueur)

    la voilà!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
        public int compare(Joueur o1, Joueur o2) {
            return o1.getNum() - o2.getNum();
        }
    Comme je vous ai dit, ca ne marche pas

  4. #4
    Débutant  
    Inscrit en
    Mai 2006
    Messages
    705
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 705
    Points : 117
    Points
    117
    Par défaut
    Ce que je ne comprends pas c'est que: Comment est-ce possible d'invoquer une méthode d'instance avec le nom de la classe????

    nomClasse :: nomMethode
    La règle, normalement, dit qu'on invoque une méthode de classe "static" on utilisant le nom de classe ... au contraire d'une méthode d'instance, on l'invoque avec le nom de l'instance

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     nomdInstance::nomMethodeInstance

  5. #5
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par L'aigle de Carthage Voir le message
    Ce que je ne comprends pas c'est que: Comment est-ce possible d'invoquer une méthode d'instance avec le nom de la classe????
    En considérant que l'instance sur laquelle appeler la méthode, est un des paramètres de la méthode référencée.

    C'est donc pour cela que ta "3e ligne" ne marche pas.

    C'est une méthode d'instance, pas static, donc pour l'appeler, il faut :

    - une instance de Joueur sur laquelle l'appeler
    - une instance de Joueur pour le paramètre o1
    - une instance de Joueur pour le paramètre o2

    Ça fait trois instances de Joueur nécessaire pour pouvoir appeler Joueur::compare. sort() n'en fournit que deux, pour comparer les joueurs deux à deux. Ça ne marchera donc pas.

    Tu peux l'utiliser de la même manière que comp(), puisqu'elles ont les mêmes signatures.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Appeler une méthode ayant un tableau d'objets pour paramètres
    Par Phil564 dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 11/12/2014, 08h03
  2. Faire exécuter une méthode d'instance
    Par shub22 dans le forum XCode
    Réponses: 0
    Dernier message: 03/12/2014, 17h27
  3. [JMX] Appel d'une méthode distante avec retour d'objet complexe
    Par hugo123 dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 24/07/2009, 12h18
  4. Réponses: 2
    Dernier message: 30/03/2009, 12h21
  5. [JACOB] Comment passer un objet par référence à une méthode
    Par zlavock dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 21/03/2005, 18h28

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