2009-09-11 166 views
1

說我有3類,像這樣:有沒有辦法確定一個類是Java中的一個實例?

class A {} 
class B extends A {} 
class C extends A {} 

難道然後纔有可能確定特定對象是否是的AB,或C一個實例?

我認爲,這樣的事情可能工作:

if (myObject.getClass().isInstance(B.class)) { 
    // do something for B 
} else (myObject.getClass().isInstance(C.class)) { 
    // do something for C 
} else { 
    // do something for A 
} 

但閱讀一點點,我認爲這將始終評估爲B,因爲它只是測試,如果鑄造會工作,還有他們之間沒有本質區別了。

回答

7

這樣做:

if (myObject instanceof B) { 
    // do something for B 
} else (myObject instanceof C) { 
    // do something for C 
} else { 
    // do something for A 
} 
+0

謝謝...正是我一直在尋找。 – 2009-09-11 07:19:40

9

的更簡單,更快速的代碼是:

if (myObject instanceof B) { 
} else if (myObject instanceof C) { 
} else if (myObject instanceof A) { 
} 

注意順序很重要:你必須有測試爲A最後,因爲這會爲成功還有BC的實例。

但是,您的原始代碼幾乎可以工作。 Class.isInstance檢查值是否真的是給定類或任何超類的實例。因此,如果myObjectC的實例,則B.class.isInstance(myObject)將返回false。所有你有錯的是你正在呼籲myObjectgetClass()不必要的,而不是使用B.class

這是,如果你不知道你是哪個班在編譯時興趣,你會採取的方法 - instanceof運算符僅在您可以在代碼中靜態指定類型時才起作用。

現在,如果你想找出是否myObject實例正是B(而不是一個子類),則只需使用:

if (myObject.getClass() == B.class) 

(這將炸燬,如果myObject是空引用,當然)。

+0

在典型的堆疊覆蓋面上回答...我的意思是,Skeet矯枉過正的樣式。 :d – Epaga 2009-09-11 09:21:54

0

有一個instanceof運營商,可以做你想做的,就像其他人已經回答的一樣。

但請注意,如果您需要這樣的事情,這表明您的程序設計中可能存在缺陷。更好,更面向對象的方法是通過使用多態性:在超類A中放置一個方法,在B和C中重寫該方法,並在myObject上調用該方法(應該具有類型A):

A myObject = ...; // wherever you get this from 

// Override someMethod in class B and C to do the things that are 
// specific to those classes 
myObject.someMethod(); 

instanceof是醜陋的,應儘可能避免,就像鑄造醜陋,可能不安全,應該避免。

1

你也可能想看看double dispatch idiom,這是一種OO方式,根據不支持多方法的語言的參數類型來改變行爲。

0

,你可以快速回復做到這一點

if (myObject.getClass() == B.class) { 
    // do something for B (not subclasses of b!!!) 
} else if(myObject.getClass() == C.class) { 
    // do something for C (not subclasses of c!!!) 
} else if(myobject.getClass() == A.class) { 
    // do something for A (not subclasses of A!!) 
} else if(myobjects instanceof A){ 
    //all other subclasses of A 
} 
相關問題