2012-09-20 5 views
7

So überprüfen Ich möchte, um zu sehen, ob eine Klasse zu einer Superklasse zugeordnet werden kann, die viele Unterklassen, so etwas wie diesesIsAssignableFrom nicht true zurück für Unterklasse

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

enthält Warum diese Rückkehr tut falsch ? Offensichtlich kann es der Klasse B zugewiesen werden

B b = (B)a 

gibt keinen Fehler zurück, also warum wird das falsch zurückgegeben. Ist es nicht die Funktion, die es selbst beschreibt? Gibt es eine Funktion, die das erreicht, was ich will (dh ich bin diese Klasse oder eine Unterklasse davon)?

Antwort

14

Wenn das, was Sie tun, ist, testen, ob oder nicht a ‚s tatsächliche Typ B oder ein Subtyp ist, haben Sie es nach hinten bekam: es ist

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

Vielen Dank, mein Herr, ich habe mit der Vergangenheit für die Vergangenheit gekämpft. Ich fühle mich jetzt wie ein Idiot =). –

5

Dies liegt daran, getClass() die tatsächliche Klasse zurückgibt, nicht auf die deklarierte Klasse einer Variablen - a.getClass() wird die Klasse zurückkehren C (C.class), die die tatsächliche Klasse des Objekts, das auf die Variable A a zugewiesen wurde und Sie kann in der Tat keine B auf einen C

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

+0

Gibt es eine Weise, die ich sagen kann, ist dies Klasse die gewünschte Klasse oder irgendeine Unterklasse davon? –

+3

Ja, 'isAssignableFrom'. Aber ich vermute, Sie könnten 'B.class.isAssignableFrom (a.getClass())' meinen, nicht umgekehrt. –

+0

@LouisWasserman Oh Mann du hast es genagelt, das ist genau das, was ich wollte. Wenn du eine Antwort mit diesem Kommentar posten willst, werde ich es markieren, ich habe einfach geschrieben, was ich rückwärts wollte. –

0

Weil Klasse B nicht ausfahren/implementieren Klasse C, weist das ist, was IsAssignableFrom() testet. Eine Instanz der Klasse B könnte gemäß Ihrem Beispiel eine Instanz der Klasse C sein. Um das zu testen, verwende 'instanceof'.