2012-09-20 7 views
7

quindi voglio controllare per vedere se una classe è assegnabile ad una classe super-che contiene molte classi secondarie, qualcosa di simileisAssignableFrom non restituisce vero per sottoclasse

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); 
} 

Perché questo ritorno falso ? Ovviamente può essere assegnato alla classe B come

B b = (B)a 

non restituisce un errore, quindi perché restituisce false. Non è la funzione che descrive se stessa come? Esiste una funzione che realizza ciò che voglio a me (cioè io sono quella classe o una sottoclasse di esso)?

risposta

14

Se ciò che si vuole fare è testare se o non a 's tipo effettivo è B o un sottotipo, hai all'indietro: è

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

Grazie signore, ho combattuto con questo per il passato come ora. Mi sento un idiota ora =). –

5

Questo perché getClass() restituisce la classe reale, non alla classe dichiarata di una variabile - a.getClass() restituirà la classe C (C.class), che è la classe reale dell'oggetto che è stato assegnato alla variabile A a e si infatti non può assegnare un B ad un C

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

+0

C'è un modo che posso dire, è questo classe la classe che voglio o qualsiasi sottoclasse di esso? –

+3

Sì, 'isAssignableFrom'. Ma sospetto che tu possa significare "B.class.isAssignableFrom (a.getClass())", non il contrario. –

+0

@LouisWasserman Oh l'uomo l'hai inchiodato, è esattamente quello che volevo. Se vuoi pubblicare una risposta con quel commento, la segnerò, ho appena scritto ciò che volevo fare all'indietro. –

0

Poiché classe B non estende/attuare classe C, che è ciò che isAssignableFrom) (test. Un'istanza di classe B potrebbe essere un'istanza di classe C, come da esempio. Per provarlo, usa "instanceof".