2012-09-21 7 views
6

Lassen Sie uns sagen, ich habe eine Schnittstelle in Java:Klasse Schnittstelle implementieren sollten in der Lage sein, nur ein Objekt der gleichen Klasse hinzufügen

interface I { 
    void add(I foo); 
} 

, und auch zwei Klassen C und D, die diese Schnittstelle implementieren.

Gibt es eine Möglichkeit, die Schnittstelle ändern kann so, dass ich nur tun konnte:

C c = new C(); 
c.add(new C()); 

, aber nicht

c.add(new D()); 

?

hatte ich diese Frage auf einer Prüfung, aber meine einzige Idee war, den Instanceof Operator in der Definition des Verfahrens:

class C implements I { 
    public void add(I foo) { 
     if (foo instanceof C) { 
      System.out.println("instance of C"); 
     } else { 
      System.out.println("another instance"); 
     } 
    } 
} 

aber ich weiß nicht, wie die Schnittstelle ändern so dass ich denselben Effekt produziere.

Dank

Antwort

7

Ja - Sie brauchen Generika:

interface I <T extends I<T>> { 
    void add(T foo); 
} 

eine Klasse zu definieren, es zu benutzen, Code es wie folgt aus:

class C implements I<C> { 
    @Override 
    public void add(C foo) { 
     // 
    } 
} 

Beachten Sie, dass es keine Möglichkeit gibt zu verhindern ist, der Implementierer aus der Codierung dieses (unter der Annahme implementiert auch I):

class C implements I<D> { 
    @Override 
    public void add(D foo) { 
     // 
    } 
} 

Dies würde jedoch nur ein Problem, wenn der Codierer der Klasse C von der Existenz der Klasse wusste D und entschied sich, es zu benutzen, was unwahrscheinlich ist, wenn sie auf Codierung Klasse C fokussiert sind.

Auch wenn ich diese Prüfungsfrage einstelle, würde ich erwarten, dass das obige die Antwort ist.

+1

Diese Methode ist nicht narrensicher. Zum Beispiel können Sie immer noch etwas wie "Klasse D implementiert I " tun. Es ist jedoch ein sehr starker Indikator für Absicht, und ein Entwickler, der das oben genannte verletzt, verdient alles, was er bekommt. – Dunes

+2

Um eine Warnung vor einem nicht parametrisierten Typ zu vermeiden, sollte die Deklaration "Schnittstelle I >" lauten. –

+0

@Bohemian Danke! – Claudiu

Verwandte Themen