2009-04-19 22 views
121

Esto probablemente se haya preguntado antes, pero una búsqueda rápida solo generó la misma pregunta para C#. See here.Prueba si el objeto implementa la interfaz

Lo que básicamente quiero hacer es comprobar si un objeto determinado implementa una interfaz determinada.

Creo que encontré una solución, pero esto no es lo suficientemente cómodo para usarla con frecuencia en los enunciados 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 sus respuestas. Especialmente para Damien Pollet y Noldorin, me hiciste replantear mi diseño, así que ya no pruebo las interfaces.

+3

¿No puedes tratar de fundición y detectar la excepción si uno se lanza (o comprobar si hay ¿un resultado nulo incluso, si Java tiene algo análogo al operador C# "como")? Soy codificador de C# en lugar de Java, así que solo estoy adivinando aquí, aunque creo que tal enfoque sería posible en cualquier lenguaje OO. – Noldorin

+0

yay! de nada :) –

+0

La excepción de tirar es una buena práctica en este caso solo si no tiene que preocuparse por el rendimiento. – Rafa

Respuesta

159

El operador instanceof hace el trabajo de una manera segura NullPointerException. Por ejemplo:

if ("" instanceof java.io.Serializable) { 
    // it's true 
} 

cede true. Desde:

if (null instanceof AnyType) { 
    // never reached 
} 

produce falsa, el operador instanceof es seguro nulo (el código que envió no lo es).

instanceof es el, en tiempo de compilación alternativa caja fuerte incorporada a Class#isInstance(Object)

+4

instanciaof solo funciona en literales de clase. Por lo tanto, no se puede utilizar en el caso del OP – LordOfThePigs

+0

seguro, es seguro en tiempo de compilación; y es la manera incorporada y es el argumento de la pregunta (imho) – dfa

+0

@LordOfThePigs no, no lo hace. Comprueba si también se implementa una interfaz. – NimChimpsky

40

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.

+1

+1 esto - no fallará si el objeto es nulo – msangel

3

que era fácil:

interf.isInstance(object) 
7

prefiero instanceof:

if (obj instanceof SomeType) { ... } 

que es mucho más común y fácil de leer que SomeType.isInstance(obj)

+3

Recuerde que 'if (obj instanceof SomeType) {...}' es estático (es decir, no puede cambiar en el tiempo de ejecución) y 'SomeType.isInstance (obj)' es dinámico. –

2

Si desea 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 dispositivo que ha definido que puede implementar una serie de interfaces. Con este código se obtiene sólo los tipos que implementan una interfaz definida

0

con ArrayUtils Apache commons-lang, ver si la interfaz que necesita está contenida en las interfaces de los que objetar

public static Boolean implementsInterface(Object object, Class interf){ 
    return ArrayUtils.contains(object.getClass().getInterfaces(), interf); 
} 
1

he tenido 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ó 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 comprobar si el campo es ADL! Nula 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()); 
    } 
} 
Cuestiones relacionadas