Test if object implements interface
This has probably been asked before, but a quick search only brought up the same question asked for C#. See here.
What I basically want to do is to check wether a given object implements a given interface.
I kind of figured out a solution but this is just not comfortable enough to use it frequently in if or case statements and I was wondering wether Java does not have built-in solution.
public static Boolean implementsInterface(Object object, Class interf){
for (Class c : object.getClass().getInterfaces()) {
if (c.equals(interf)) {
return true;
}
}
return false;
}
EDIT: Ok, thanks for your answers. Especially to Damien Pollet and Noldorin, you made me rethink my design so I don't test for interfaces anymore.
The instanceof
operator does the work in a NullPointerException
safe way. For example:
if ("" instanceof java.io.Serializable) {
// it's true
}
yields true. Since:
if (null instanceof AnyType) {
// never reached
}
yields false, the instanceof
operator is null safe (the code you posted isn't).
instanceof is the built-in, compile-time safe alternative to Class#isInstance(Object)
This should do:
public static boolean implementsInterface(Object object, Class interf){
return interf.isInstance(object);
}
For example,
java.io.Serializable.class.isInstance("a test string")
evaluates to true
.
I prefer instanceof
:
if (obj instanceof SomeType) { ... }
which is much more common and readable than SomeType.isInstance(obj)
that was easy :
interf.isInstance(object)
If you want to test for interfaces:
public List<myType> getElement(Class<?> clazz) {
List<myType> els = new ArrayList<myType>();
for (myType e: this.elements.values()) {
if (clazz.isAssignableFrom(e.getClass())) {
els.add(e);
}
}
return els;
}
clazz is an Interface and myType is a Type that you defined that may implement a number of interfaces. With this code you get only the types that implement a defined interface