2012-09-20 18 views
7

por lo que quiero comprobar para ver si una clase es asignable a un super clase que contiene muchas subclases, algo como estoisAssignableFrom no vuelve verdad para subclase

public class A { 
    public A(){ } 
} 

public class B extends A { 
    public B(){ } 
} 

public class C extends B { 
    public C(){ } 
} 

public static void main() { 
    A a = new C(); 
    boolean whyAmIFalse = a.getClass().isAssignableFrom(B.class); 
} 

¿Por qué este retorno falsa ? Obviamente, se puede asignar a la clase B como

B b = (B)a 

no devuelve un error, así que por qué se esta volviendo falsa. ¿No es la función que se describe a sí misma como? ¿Hay alguna función que logre lo que yo quiero (es decir, soy esa clase o una subclase de ella)?

Respuesta

14

Si lo que quieres hacer es probar si o no a 's tipo real es B o un subtipo, lo tienes al revés: es

B.class.isAssignableFrom(a.getClass()); 
+1

Gracias señor, he estado peleando con esto por el pasado como una hora. Me siento como un idiota ahora =). –

5

Esto se debe a getClass() devuelve la clase real, no la clase declarada de una variable - a.getClass() volverá a la clase C (C.class), que es la clase real del objeto que se asigna a la variable y A a que de hecho no se puede asignar un B a un C

http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html#getClass()

+0

¿Hay una manera que puedo decir, es esta clasifica la clase que quiero o cualquier subclase de ella? –

+3

Sí, 'isAssignableFrom'. Pero sospecho que podría querer decir 'B.class.isAssignableFrom (a.getClass())', y no al revés. –

+0

@LouisWasserman Oh, hombre, lo clavaste, eso es exactamente lo que yo quería. Si desea publicar una respuesta con ese comentario, lo marcaré, solo escribí lo que quería al revés. –

0

Debido a que la clase B no se extiende/implementar la clase C, que es lo que() isAssignableFrom pruebas. Una instancia de clase B podría ser una instancia de clase C, según su ejemplo. Para probar eso, usa 'instanceof'.

Cuestiones relacionadas