2017-05-14 2 views
-2

ich eine Methode schreibe, die ein Class als Argument übergeben wird, wie folgt aus:Gibt an, dass ein Gerät der Klasse Argument eine bestimmte Schnittstelle implementieren muss

public void doStuff(Class<?> clazz) { 
    /* do stuff */ 
} 

ich dann das Verfahren wie folgt aufrufen können:

doStuff(FooBar.class); 

Wie erzwinge ich auf der Compiler-Ebene, dass das Argument nur eine Klasse sein kann, die eine bestimmte Schnittstelle implementiert?

habe ich versucht, die folgenden-

public <T extends FooInterface> void doStuff(Class<T> clazz) { 
    /* do stuff */ 
} 

-aber einen Compiler-Fehler für die folgende Anweisung zu erhalten:

doStuff(FooBar.class); // FooBar implements FooInterface 

Wie mache ich das richtig?

+1

Stellen Sie ein komplettes minimal Beispiel reproduziert das Problem, und posten den genauen und vollständigen Übersetzungsfehler . –

+0

Zeigen Sie uns die 'FooBar' Klasse – Sweeper

+1

Got it-der Code selbst war in Ordnung, der Kompilierungsfehler war über eine nicht abgefangene Ausnahme. Ein try/catch-Block um den eigentlichen Methodenaufruf hat es behoben. Vielen Dank! – user149408

Antwort

1

Ich versuchte Ihre Aussage, aber es scheint zu funktionieren. Bitte sehen Sie sich den folgenden Code an. Ich weiß nicht, die genaue Klassendefinitionen, aber hier in diesem Fall

t.doStuff(Foo.class) 

funktioniert, aber

t.doStuff(Faa.class) 

nicht

public class Test{ 
public <T extends FooInterface> void doStuff(Class<T> clazz) { 
    /* do stuff */ 
} 

public static void main(String[] args) { 
    Test t = new Test(); 
    t.doStuff(Foo.class); //This one compiles fine 
    //g.doStuff(Faa.class); <-- This line gives error 
} 
} 

interface FooInterface{ 

} 

class Foo implements FooInterface{ 

} 

class Faa{ 

} 
+0

hätte den Compiler-Fehler näher betrachtet - der Code war in Ordnung, der Fehler war nicht verwandt, siehe oben. – user149408

+0

Ja, stimme total zu :-) –

0

der Code Stellt sich heraus, habe ich versucht, in der Tat richtig war , und der Compilerfehler (dh Eclipse, der den Aufruf in rot unterstrich) war ein Ergebnis eines fehlenden try/catch-Blocks um den Aufruf herum.

Es gibt zwei Möglichkeiten, um das gewünschte Ergebnis zu erzielen:

public <T extends FooInterface> void doStuff(Class<T> clazz) { 
    /* do stuff */ 
} 

Oder weniger aufwendig:

public void doStuff(Class<? extends FooInterface> clazz) { 
    /* do stuff */ 
} 
Verwandte Themen