Dies wurde wahrscheinlich schon einmal gestellt, aber eine schnelle Suche brachte nur die gleiche Frage nach C #. Siehe hier.
Grundsätzlich möchte ich überprüfen, ob ein bestimmtes Objekt eine bestimmte Schnittstelle implementiert.
Ich habe eine Lösung gefunden, aber diese ist einfach nicht komfortabel genug, um sie häufig in if- oder case-Anweisungen zu verwenden, und ich habe mich gefragt, ob Java keine integrierte Lösung hat.
public static Boolean implementsInterface(Object object, Class interf){
for (Class c : object.getClass().getInterfaces()) {
if (c.equals(interf)) {
return true;
}
}
return false;
}
EDIT: Ok, danke für deine Antworten. Besonders für Damien Pollet und Noldorin haben Sie mich dazu gebracht, mein Design zu überdenken, damit ich nicht mehr auf Schnittstellen teste.
Antworten:
Der
instanceof
Bediener erledigt die Arbeit aufNullPointerException
sichere Weise. Beispielsweise:ergibt wahr. Schon seit:
ergibt false, der
instanceof
Operator ist null sicher (der von Ihnen gepostete Code ist nicht).instanceof ist die integrierte, zur Kompilierungszeit sichere Alternative zu Class # isInstance (Object).
quelle
MyClass.class
oderMyInterface.class
in Ihren Quellcode schreiben . Klassenliterale können sich auf Klassen, Schnittstellen und primitive Typen beziehen und geben eine entsprechende Instanz der Klassenklasse zurück. Mein Punkt ist, dass das OP kein Klassenliteral verwendet, sondern stattdessen eine Instanz der Klassenklasse, und leider muss der Operator auf der rechten Seite desinstanceof
Schlüsselworts ein Klassenliteral sein, keine Instanz der Klassenklasse.Dies sollte tun:
Beispielsweise,
bewertet zu
true
.quelle
Ich bevorzuge
instanceof
:Das ist viel häufiger und lesbarer als
SomeType.isInstance(obj)
quelle
if (obj instanceof SomeType) { ... }
statisch ist (dh sich zur Laufzeit nicht ändern kann) undSomeType.isInstance(obj)
dynamisch ist.das war einfach :
quelle
Wenn Sie auf Schnittstellen testen möchten:
}}
clazz ist eine Schnittstelle und myType ist ein von Ihnen definierter Typ, der eine Reihe von Schnittstellen implementieren kann. Mit diesem Code erhalten Sie nur die Typen, die eine definierte Schnittstelle implementieren
quelle
Ich hatte heute Abend dieses Problem mit Android und nachdem ich mir die Javadoc-Lösungen angesehen hatte, kam ich auf diese wirklich funktionierende Lösung, nur für Leute wie mich, die etwas mehr als eine Javadoc-Erklärung brauchen.
Hier ist ein funktionierendes Beispiel mit einer tatsächlichen Schnittstelle unter Verwendung von Android Java. Es überprüft die Aktivität, die die AboutDialogListener-Schnittstelle implementiert hat, bevor versucht wird, das AboutDialogListener-Feld umzuwandeln.
... Später überprüfe ich, ob das Feld adl! Null ist, bevor ich die Schnittstelle aufrufe
quelle
Überprüfen Sie mit Apache commons-lang ArrayUtils, ob die gewünschte Schnittstelle in den Schnittstellen Ihres Objekts enthalten ist
quelle