2009-09-30 4 views
46

Il est légal de le faire en Java:Comment puis-je exiger un argument de méthode dans Java pour implémenter plusieurs interfaces?

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

Comment puis-je faire (syntaxe non juridique):

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

Je voudrais si possible de forcer les appelants à utiliser des objets qui sont à la fois Appendable et pouvant être fermé, sans nécessiter de type spécifique. Il existe plusieurs classes standard qui font cela, par ex. BufferedWriter, PrintStream, etc.

Si je définir ma propre interface

interface AppendableAndCloseable extends Appendable, Closeable {} 

qui ne fonctionnera pas car les classes standard qui mettent en œuvre Annexable et Closeable ne mettent pas en œuvre mon interface AppendableAndCloseable (à moins que je ne comprends pas Java aussi bien que je pense que je fais ... les interfaces vides ajoutent encore l'unicité au-delà de leurs superinterfaces).

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

  1. choisir un interface (par exemple Annexable), et utiliser des tests d'exécution pour assurer l'argument est un instanceof les autres. Inconvénient: problème non détecté au moment de la compilation.

  2. nécessitent plusieurs arguments (prises à la compilation correcte, mais semble dorky):

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

Cela fait certainement défaut. Mais quelle est votre question exactement? – NawaMan

Répondre

78

Vous pouvez le faire avec les médicaments génériques:

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

Votre syntaxe était presque droite , réellement.

+0

aha! Hourra! :-) –

+0

Cela fonctionne aussi pour les outils? J'essaye de faire un objet de paramètre doit être serialzable? – Zapnologica

+1

@Zapnologica: Pour implémenter une interface? Non, vous ne pouvez pas mettre de restrictions de type supplémentaires sur un paramètre générique déclaré dans l'interface. –

Questions connexes