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()