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

Java Discussion :

Method Reference et Javadoc


Sujet :

Java

  1. #1
    Membre habitué
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Points : 188
    Points
    188
    Par défaut Method Reference et Javadoc
    Bonjour,

    J'essaie de comprendre le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hiddenFiles = new File(".").listFiles(File::isHidden);
    Quand je regarde la Javadoc je ne retrouve la fonction listFiles que sous la forme :

    - public File[] listFiles()
    - public File[] listFiles(FilenameFilter filter)
    - public File[] listFiles(FileFilter filter)

    Comment savoir alors que je peux passer la fonction isHidden comme paramètre à la fonction listFiles.

    Merci

  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 608
    Points
    21 608
    Par défaut
    Hello,

    Les références de méthodes peuvent être données là où on attend une interface fonctionnelle compatible.

    En gros si on a une interface fonctionnelle MonInterface, et une classe MaClasse qui possède une méthode maMethode() compatible avec cette interface fonctionnelle, on peut faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonInterface mi = MaClasse::maMethode;
    Et donc si une méthode autreMethode() prend en paramètre un objet de type MonInterface, en gros, si elle est définie comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void autreMethode(MonInterface mi) {
    alors on peut l'appeler comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    autreMethode(MaClasse::maMethode);
    Ok. Reste à définir ce qu'est une interface fonctionnelle. Eh bien c'est :

    • une interface
    • qui fournit une et seulement une méthode abstraite


    Donc pour voir si une interface est une interface fonctionnelle, on compte ses méthodes abstraites.
    Les champs qu'elle définit ? => ça compte pas, c'est pas des méthodes.
    Les classes, interfaces, enums qu'elle définit ? => ça compte pas, c'est pas des méthodes.
    Les méthodes static ? => ça compte pas, elles sont toujours définies.
    Les méthodes par défaut ? => ça compte pas, elles sont définies.
    Les méthode privées ? => ça compte pas, elles sont toujours définies.
    Les méthodes non définies ? => voilà, on compte ça.

    Et s'il y en a une et exactement une, alors l'interface est une interface fonctionnelle. À noter que si une interface étend d'autres interfaces, elle hérite des méthodes de ces interfaces, donc les non définies héritées comme ça, comptent aussi.

    Bref, une interface fonctionnelle, ça ressemble à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    interface MonInterface {
      void uneMethode(); // une méthode abstraite, et une seule
    }
    Pour en revenir aux méthodes File.listFiles(), voyons lesquelles prennent une interface fonctionnelle en paramètre :

    • public File[] listFiles() => pas de paramètre, donc c'est pas bon.
    • public File[] listFiles(FilenameFilter filter) => en regardant FilenameFilter on constate que c'est une interface fonctionnelle, donc on garde pour l'instant.
    • public File[] listFiles(FileFilter filter) => en regardant FileFilter on constate que c'est une interface fonctionnelle, donc on garde pour l'instant.


    Reste donc deux candidates possibles.

    Ces deux-là prennent en paramètre une interface fonctionnelle, mais encore faut-il qu'elle soit compatible avec File::isHidden

    Pour qu'une référence de méthode soit compatible avec une interface fonctionnelle, il faut que :

    • La référence de méthode puisse recevoir les mêmes paramètres que la méthode de l'interface fonctionnelle
    • La méthode de la référence de méthode renvoie un type qui peut être utilisé pour le type de retour de la méthode de l'interface fonctionnelle.


    Alors, étudions la référence de méthode File::isHidden.
    File.isHidden() est une méthode qui ne prend pas de paramètre.
    Mais c'est une méthode d'instance, et File::isHidden est une référence qui ne précise pas d'instance, seulement la classe File.
    La référence de méthode doit donc prendre en paramètre, une instance de File. Et c'est tout. Un seul paramètre.
    File.isHidden() renvoie un boolean.

    Maintenant regardons les interfaces fonctionnelles qui étaient proposées en paramètre de File.listFiles() :

    • FilenameFilter : méthode boolean accept​(File dir, String name). Deux paramètres. Notre référence de méthode n'en accepte qu'un. Ça ne colle pas.
    • FileFilter : méthode boolean accept​(File pathname). Un paramètre de type File. Ça colle. Type de retour boolean. Ça colle aussi.


    => Conclusion, c'est la méthode public File[] listFiles(FileFilter filter) qui était en mesure d'accepter la référence de méthode File::isHidden
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Java 8 method reference
    Par win_ubuntu dans le forum Langage
    Réponses: 2
    Dernier message: 19/02/2015, 18h26
  2. Réponses: 2
    Dernier message: 31/01/2008, 11h58
  3. Réponses: 1
    Dernier message: 24/12/2007, 10h11
  4. Réponses: 1
    Dernier message: 26/07/2007, 17h29
  5. Cannot make a static reference to the non-static method
    Par semaj_james dans le forum Langage
    Réponses: 5
    Dernier message: 11/05/2006, 23h10

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