Probablemente esto ya se haya preguntado antes, pero una búsqueda rápida solo generó la misma pregunta que se hizo para C #. Mira aquí.
Lo que básicamente quiero hacer es verificar si un objeto determinado implementa una interfaz determinada.
En cierto modo, descubrí una solución, pero esto no es lo suficientemente cómodo como para usarla con frecuencia en declaraciones if o case y me preguntaba si Java no tiene una solución incorporada.
public static Boolean implementsInterface(Object object, Class interf){
for (Class c : object.getClass().getInterfaces()) {
if (c.equals(interf)) {
return true;
}
}
return false;
}
EDITAR: Ok, gracias por tus respuestas. Especialmente para Damien Pollet y Noldorin, me hiciste repensar mi diseño para que ya no pruebe las interfaces.
Respuestas:
El
instanceof
operador hace el trabajo deNullPointerException
manera segura. Por ejemplo:rinde verdad. Ya que:
produce falso, el
instanceof
operador es nulo seguro (el código que publicó no lo es).instanceof es la alternativa segura incorporada en tiempo de compilación a Class # isInstance (Object)
fuente
MyClass.class
oMyInterface.class
en tu código fuente. Los literales de clase pueden referirse a clases, interfaces y tipos primitivos, y devolverán una instancia correspondiente a la clase Class. Mi punto es que el OP no está usando un literal de clase, sino una instancia de la clase Class, y desafortunadamente el operador del lado derecho de lainstanceof
palabra clave debe ser un literal de clase, no una instancia de la clase Class.Esto debería hacer:
Por ejemplo,
evalúa a
true
.fuente
Yo prefiero
instanceof
:que es mucho más común y legible que
SomeType.isInstance(obj)
fuente
if (obj instanceof SomeType) { ... }
es estático (es decir, no puede cambiar en tiempo de ejecución) ySomeType.isInstance(obj)
es dinámico.eso fue fácil :
fuente
Si quieres probar interfaces:
}
clazz es una interfaz y myType es un tipo que definió que puede implementar varias interfaces. Con este código obtienes solo los tipos que implementan una interfaz definida
fuente
Tuve este problema esta noche con Android y después de mirar las soluciones de javadoc se me ocurrió esta solución de trabajo real solo para personas como yo que necesitan un poco más que una explicación de javadoc.
Aquí hay un ejemplo de trabajo con una interfaz real que usa Android Java. Comprueba la actividad que llamó implementado la interfaz AboutDialogListener antes de intentar convertir el campo AboutDialogListener.
... Más tarde compruebo si el campo adl es! Nulo antes de llamar a la interfaz
fuente
Con Apache commons-lang ArrayUtils, vea si la interfaz que necesita está contenida en las interfaces de su objeto
fuente