2010-04-07 76 views

回答

111

instanceof運算符適用於參考類型,如Integer,而不是對象,如new Integer(213)。你可能想是這樣

clazz.isInstance(obj) 

附註:如果你寫

public boolean isOf(Class clazz, Object obj){ 
    return clazz.isInstance(obj) 
} 

不能確定,如果你需要一個方法了,雖然你的代碼會更簡潔。

+0

我知道代碼是完全無用,我只是想表明我的困惑:) – eric2323223 2010-04-07 07:37:10

+6

'整數'是**不是**類的文字。 'Integer.class'應該是一個類文字(參見JLS的§15.8.2:http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.8.2)。 'instanceof'運算符接受JLS的第15.20.2節中的「ReferenceType」(又名類型名稱):http://java.sun.com/docs/books/jls/third_edition/html/expressions.html# 15.20.2 – 2010-04-07 08:03:31

+2

我會使用'clazz.isInstance(obj)',因爲對象已經提供了。 – 2010-04-07 08:09:21

12

instanceof只能用於明確的類名(在編譯時聲明)。爲了做一個運行檢查,你應該做的:

clazz.isInstance(obj) 

這個擁有超過clazz.isAssignableFrom(..)小的優勢,因爲它用的情況下obj == null更好的交易。

3

首先,instanceof要求右邊的操作數是一個實際的類(例如​​或obj instanceof Integer),而不是Class類型的變量。其次,你已經取得了相當普遍的新手的錯誤,你真的不應該做的......以下模式:

 
if (conditional_expression){ 
    return true; 
} else{ 
    return false; 
} 

以上可重構爲:

 
return conditional_expression; 

你應該總是執行重構,因爲它消除了冗餘if ... else語句。類似地,表達式return conditional_expression ? true : false;可重構爲相同的結果。

+2

這沒有錯。也許笨拙,但總體還可以。也許你在可預見的將來返回之前需要額外的代碼... – 2017-06-13 09:59:11

2

正如其他人所說,你不能在一個類變量傳遞給instanceof因爲類變量引用的對象的實例,而instanceof右手已經是一個。也就是說,instanceof並不意味着「y是對象x的實例」,它表示「y是類型X的實例」。如果你不知道對象和類型之間的區別,可以考慮:

Object o = new Object();

這裏,類型爲Object,並o是與該類型對象的實例的引用。因此:

if(o instanceof Object)

是有效的但

if(o instanceof o)

不是因爲o在右手側是一個對象,而不是一個類型。

更具體到你的情況,一個類的實例是不是一個類型,它是一個對象(這是由JVM爲您創建)。在你的方法中,Class是一種類型,但是clazz是一個對象(以及對象的引用)

你需要的是一種將對象與類對象進行比較的方法。事實證明,這是流行的,所以這是作爲類對象的方法提供給你的:isInstance()

這裏是Java說明文件isInstance,這也解釋了這更好:

public boolean isInstance(Object obj)

確定指定的對象是賦值兼容與此Class所表示的 對象。此方法是Java語言instanceof運算符的動態等效項。如果指定的Object參數非空並且可以將 轉換爲由此Class對象表示的引用類型而不引起 引發ClassCastException,則方法 返回true。否則返回false。

具體地,如果該Class對象表示一個聲明的類,這 方法如果指定的Object參數是表示類的 實例,則返回真(或其任何亞類);否則返回錯誤 。如果此Class對象表示一個數組類,則此方法 將返回true,如果指定的Object參數可通過標識轉換或擴展 參考轉換轉換爲數組類的 對象;否則返回false。如果此Class對象 表示一個接口,則此方法在指定Object參數的類或任何超類實現此接口時返回true; 否則返回false。如果此Class對象表示一個 基元類型,則此方法返回false。

參數: OBJ - 對象檢查
返回:如果真obj是這個類的一個實例
由於: JDK1.1