2009-09-30 4 views
46

Es ist legal dies in Java zu tun:Wie kann ich ein Methodenargument in Java benötigen, um mehrere Schnittstellen zu implementieren?

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

Wie kann ich diese (Syntax nicht legal) zu tun:

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

Ich mag würde, wenn möglich Anrufer zu zwingen, Objekte zu verwenden, die beide Anfügbar und schließbar, ohne dass ein bestimmter Typ erforderlich ist. Es gibt mehrere Standardklassen, die dies tun, z.B. BufferedWriter, Print usw.

Wenn ich meine eigene Schnittstelle definieren

interface AppendableAndCloseable extends Appendable, Closeable {} 

, die seit den Standardklassen wird nicht funktionieren, die Appendable und Verschließbare implementieren nicht implementieren meine Schnittstelle AppendableAndCloseable (es sei denn, ich verstehe nicht, Java so wie ich denke, ich mache ... leere Interfaces fügen noch über ihre Superschnittstellen hinaus Einzigartigkeit hinzu).

Der nächstgelegene ich denken kann, ist eine der folgenden Funktionen ausführen:

  1. eine Schnittstelle auswählen (z Appendable) und Laufzeittests verwenden das Argument, um sicherzustellen, ist ein instanceof die anderen. Nachteil: Problem wurde zur Kompilierzeit nicht behoben.

  2. erfordern mehrere Argumente (Fänge Kompilierung-Korrektheit sieht aber dorky):

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

Das ist sicher fehlt. Aber was genau ist deine Frage? – NawaMan

Antwort

78

Sie es mit Generika tun könnte:

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

Ihre Syntax war fast Recht , tatsächlich.

+0

aha! Hurra! :-) –

+0

Funktioniert das auch für Geräte? Ich versuche ein Parameterobjekt seriell zu machen? – Zapnologica

+1

@Zapnologica: Für die Implementierung einer Schnittstelle? Nein, Sie können keine zusätzlichen Typeinschränkungen für einen generischen Parameter festlegen, der in der Schnittstelle deklariert wurde. –

Verwandte Themen