2010-11-28 71 views
47

有沒有簡單的方法來驗證對象是否屬於給定的類?例如,我可以做檢查對象是否屬於Java中的類

if(a.getClass() = (new MyClass()).getClass()) 
{ 
    //do something 
} 

但是這需要每次都實例化一個新的對象,只有放棄它。有沒有更好的方法來檢查「a」是否屬於「MyClass」類?

回答

123

instanceof關鍵字,如由其他的答案中描述,通常是你想要的東西。 請記住instanceof也會爲true返回超類。

如果您想查看某個對象是否是某個類的直接實例,則可以比較該類。您可以通過getClass()獲取實例的類對象。您可以通過ClassName.class靜態訪問特定的課程。

因此,例如:

if (a.getClass() == X.class) { 
    // do something 
} 

在上面的例子中,如果是aX一個實例,但如果是aX一個子類的實例的條件爲真。

在比較:

if (a instanceof X) { 
    // do something 
    } 

instanceof例如,如果aX的實例,或者如果a亞類的X實例的條件爲真。

大多數情況下,instanceof是正確的。

4

嘗試運營商instanceof

15

使用instanceof操作:

if(a instanceof MyClass) 
{ 
    //do something 
} 
18

如果你需要動態地做到這一點,你可以用下面

if (clazz.isInstance(a)) { 
     // do something 
} 

其中clazzClass一個實例。

+0

或更好,但使用IsAssignableFrom(類) – Chii 2010-11-28 06:05:40

3

我同意使用instanceof已經提到過。

的使用instanceof的另一個好處是,與null參考instanceof使用時將返回false,而a.getClass()將拋出一個NullPointerException

2

通常的方法是:

if (a instanceof A) 

然而,有這樣的情況,當你不能做到這一點,如在一般的參數時A

由於Java的類型擦除,下面將無法編譯:

<A> boolean someMethod(Object a) { 
    if (a instanceof A) 
    ... 
} 

及以下將無法正常工作(並會產生unchecked cast警告):

<A> void someMethod(Object a) { 
    try { 
     A casted = (A)a;  
    } catch (ClassCastException e) { 
     ... 
    } 
} 

你可以用」因爲在運行時,A本質上是Object

這種情況下的解決方案是使用Class,而不是通用的說法:

void someMethod(Object a, Class<A> aClass) { 
    if (aClass.isInstance(a)) { 
     A casted = aClass.cast(a); 
     ... 
    } 
} 

然後,您可以調用該方法爲:

someMethod(myInstance, MyClass.class); 
someMethod(myInstance, OtherClass.class); 
相關問題