¿Cómo verificar si una subclase es una instancia de una clase en tiempo de ejecución?

En una suite de prueba de aplicaciones para Android, tengo una clase como esta, donde B es una vista:

 public class A extends B { ... etc... } 

ahora tengo una lista de objetos de vista que pueden contener objetos A , pero en este caso solo me importa si son subclases o “instancias de” B Me gustaría hacer algo como:

 ArrayList viewList = getViews(); Iterator iterator = viewList.iterator(); while (iterator.hasNext() && viewList != null) { View view = iterator.next(); if (view.getClass().isInstance(B.class)) { // this is an instance of B } } 

El problema es que cuando el if encuentra un objeto A no lo evalúa como una “instancia de B “. ¿Hay alguna manera de hacer isSubclassOf o algo así?

Debes leer la API cuidadosamente para estos métodos. A veces puedes confundirte muy fácilmente.

Es o bien:

 if (B.class.isInstance(view)) 

La API dice: Determina si el Objeto especificado (el parámetro) es compatible con la asignación del objeto representado por esta Clase (El objeto de clase al que está llamando el método)

o:

 if (B.class.isAssignableFrom(view.getClass())) 

La API dice: Determina si la clase o interfaz representada por este objeto de clase es la misma, o es una superclase o superinterfaz de, la clase o interfaz representada por el parámetro de clase especificado

o (sin reflexión y el recomendado):

 if (view instanceof B) 
 if(view instanceof B) 

Esto devolverá true si view es una instancia de B o la subclase A (o cualquier subclase de B para ese caso).

Tal vez me esté perdiendo algo, pero ¿no sería suficiente?

 if (view instanceof B) { // this view is an instance of B } 

Class.isAssignableFrom() – funciona también para interfaces. Si no quiere eso, tendrá que llamar a getSuperclass() y probar hasta llegar a Object .

Es al revés: B.class.isInstance(view)

Si hay un polymorphism, como comprobar SQLRecoverableException vs SQLException, se puede hacer así.

 try { // sth may throw exception .... } catch (Exception e) { if(SQLException.class.isAssignableFrom(e.getCause().getClass())) { // do sth System.out.println("SQLException occurs!"); } } 

Simplemente di,

 ChildClass child= new ChildClass(); if(ParentClass.class.isAssignableFrom(child.getClass())) { // do sth ... } 

Nunca he usado esto, pero pruebo view.getClass().getGenericSuperclass()

    Intereting Posts