2012-09-20 62 views
7

所以我要檢查,看看是否一類是分配給包含很多子類,像這樣isAssignableFrom不適合子類

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

爲什麼這回假超類返回true ?顯然它可以被分配到B類

B b = (B)a 

不會返回錯誤,那麼爲什麼這返回false。它不是它描述自己的功能嗎?有沒有一個函數能夠完成我想要的東西(即我是那個類還是它的一個子類)?

回答

14

如果你想要做的是測試a的實際類型是否爲B或亞型,你已經得到它倒退:它是

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

謝謝先生,我一直在爲這樣的過去而奮鬥,就像小時一樣。我現在覺得自己像一個白癡=)。 –

5

這是因爲getClass()返回實際的類,而不是類聲明的變量 - a.getClass()將返回類C(C.class),這是實際的類,它被分配到變量A a和對象你確實無法分配BC

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

+0

有沒有一種方法,我可以說,這是我想要的類還是它的任何子類? –

+3

是的,'isAssignableFrom'。但我懷疑你可能是指'B.class.isAssignableFrom(a.getClass())',而不是相反。 –

+0

@LouisWasserman哦,你釘了它,這正是我想要的。如果你想發表評論的答案,我會標記它,我只是寫了我想要的東西。 –

0

由於B類不擴展/實現C類,這是什麼isAssignableFrom()測試。根據您的示例,類B的一個實例可能是類C的一個實例。要測試它,使用'instanceof'。