subclases - reflection java 8
¿Cómo verificar si una subclase es una instancia de una clase en tiempo de ejecución? (7)
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)
Esta pregunta ya tiene una respuesta aquí:
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<View> viewList = getViews();
Iterator<View> 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í?
Es al revés: B.class.isInstance(view)
Nunca he usado esto, pero pruebo view.getClass().getGenericSuperclass()
Si hay un polimorfismo, 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
...
}
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
.
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).