Reputation: 3416
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;
}
Upvotes: 164
Views: 174766
Reputation: 2368
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
Upvotes: 3
Reputation: 116442
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)
Upvotes: 205
Reputation: 5651
I had this problem tonight with android and after looking at the javadoc solutions I came up with this real working solution just for people like me that need a little more than a javadoc explanation.
Here's a working example with an actual interface using android java. It checks the activity that called implemented the AboutDialogListener interface before attempting to cast the AboutDialogListener field.
public class About extends DialogFragment implements OnClickListener,
OnCheckedChangeListener {
public static final String FIRST_RUN_ABOUT = "com.gosylvester.bestrides.firstrunabout";
public interface AboutDialogListener {
void onFinishEditDialog(Boolean _Checked);
}
private AboutDialogListener adl;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Activity a = this.getActivity();
if (AboutDialogListener.class.isInstance(a)) {
adl = (AboutDialogListener) a;
}
}
... Later I check if the field adl is !null before calling the interface
@Override
public void onStop() {
super.onStop();
sharedPref.edit().putBoolean(About.FIRST_RUN_ABOUT, _Checked).commit();
// if there is an interface call it.
if (adl != null) {
adl.onFinishEditDialog(is_Checked());
}
}
Upvotes: 1
Reputation: 182
With Apache commons-lang ArrayUtils, see if the interface you require is contained in the interfaces of you object
public static Boolean implementsInterface(Object object, Class interf){
return ArrayUtils.contains(object.getClass().getInterfaces(), interf);
}
Upvotes: 0
Reputation: 63134
I prefer instanceof
:
if (obj instanceof SomeType) { ... }
which is much more common and readable than SomeType.isInstance(obj)
Upvotes: 9
Reputation: 65064
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
.
Upvotes: 44