52 votes

Java: Comment puis-je avoir besoin d'un argument de méthode pour implémenter plusieurs interfaces?

Il est légal de le faire en Java:

 void spew(Appendable x)
 {
     x.append("Bleah!\n");
 }

Comment puis-je faire cela (la syntaxe n'est pas légal):

 void spew(Appendable & Closeable x)
 {
     x.append("Bleah!\n");
     if (timeToClose())
         x.close();
 }

Je voudrais, si possible, à force de les appelants à utiliser des objets qui sont à la fois Appendable et Fermer, sans exiger d'un type spécifique. Il y a plusieurs classes standard, que faire, par exemple, BufferedWriter, PrintStream, etc.

Si je définir ma propre interface

 interface AppendableAndCloseable extends Appendable, Closeable {}

qui ne fonctionne pas puisque la norme classes qui implémentent Appendable et Fermer ne pas mettre en œuvre mon interface AppendableAndCloseable (à moins que je ne comprends pas Java et je pense que je fais... vide interfaces toujours ajouter un caractère unique au-dessus et au-delà de leur superinterfaces).

Le plus proche que je peux penser à est de faire l'une des opérations suivantes:

  1. choisir une interface (par exemple, Appendable), et l'utilisation d'exécution des tests pour s'assurer que l'argument est un instanceof autres. Bémol: le problème n'est pas pris au moment de la compilation.

  2. besoin de plusieurs arguments (prises au moment de la compilation de l'exactitude, mais semble ringard):

    void spew(Appendable xAppend, Closeable xClose)
    {
        xAppend.append("Bleah!\n");
        if (timeToClose())
            xClose.close();
    }
    

83voto

Michael Myers Points 82361

Vous pouvez le faire avec des génériques:

 public <T extends Appendable & Closeable> void spew(T t){
    t.append("Bleah!\n");
    if (timeToClose())
        t.close();
}
 

Votre syntaxe était presque exacte, en fait.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X