tutorial - jframe en java
Prueba si el objeto implementa la interfaz (7)
Probablemente ya se haya preguntado antes, pero una búsqueda rápida solo generó la misma pregunta que se le hizo a C #. Mira aquí.
Lo que básicamente quiero hacer es verificar si un objeto determinado implementa una interfaz determinada.
De alguna forma, descubrí una solución, pero esto no es lo suficientemente cómodo como para usarla con frecuencia en sentencias de caso o de caso, 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;
}
EDIT: Ok, gracias por tus respuestas. Especialmente para Damien Pollet y Noldorin, me hiciste replantear mi diseño, así que ya no pruebo las interfaces.
Con Apache commons-lang ArrayUtils, vea si la interfaz que necesita está contenida en las interfaces de su objeto
public static Boolean implementsInterface(Object object, Class interf){
return ArrayUtils.contains(object.getClass().getInterfaces(), interf);
}
El operador instanceof
hace el trabajo en una forma segura NullPointerException
. Por ejemplo:
if ("" instanceof java.io.Serializable) {
// it''s true
}
cede cierto. Ya que:
if (null instanceof AnyType) {
// never reached
}
produce falso, el operador instanceof
es seguro (el código que publica no es).
instanceof es la alternativa Class#isInstance(Object) segura en tiempo de compilación para la Class#isInstance(Object)
Esto debería hacer:
public static boolean implementsInterface(Object object, Class interf){
return interf.isInstance(object);
}
Por ejemplo,
java.io.Serializable.class.isInstance("a test string")
evalúa a true
.
Prefiero instanceof
:
if (obj instanceof SomeType) { ... }
que es mucho más común y legible que SomeType.isInstance(obj)
Si quieres probar las interfaces:
public List<myType> getElement(Class<?> clazz) {
List<myType> els = new ArrayList<myType>();
for (myType e: this.elements.values()){
if (clazz.isAssignableFrom(e.getClass()) == true){
els.add(e);
}
}
return els;
}
clazz es una interfaz y myType es un Tyoe que ha definido que puede implementar una serie de interfaces. Con este código, obtienes solo los tipos que implementan una interfaz definida
Tuve este problema esta noche con android y después de mirar las soluciones de Java descubrí 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ó implementó la interfaz AboutDialogListener antes de intentar lanzar el campo AboutDialogListener.
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;
}
}
... Más tarde compruebo si el campo adl es! Null antes de llamar a la interfaz
@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());
}
}
eso fue fácil :
interf.isInstance(object)