這段代碼爲什麼不編譯?爲什麼不能將「Class」變量傳遞給instanceof?
public boolean isOf(Class clazz, Object obj){
if(obj instanceof clazz){
return true;
}else{
return false;
}
}
爲什麼我不能在一個類變量傳遞給instanceof
?
這段代碼爲什麼不編譯?爲什麼不能將「Class」變量傳遞給instanceof?
public boolean isOf(Class clazz, Object obj){
if(obj instanceof clazz){
return true;
}else{
return false;
}
}
爲什麼我不能在一個類變量傳遞給instanceof
?
instanceof
運算符適用於參考類型,如Integer
,而不是對象,如new Integer(213)
。你可能想是這樣
clazz.isInstance(obj)
附註:如果你寫
public boolean isOf(Class clazz, Object obj){
return clazz.isInstance(obj)
}
不能確定,如果你需要一個方法了,雖然你的代碼會更簡潔。
instanceof
只能用於明確的類名(在編譯時聲明)。爲了做一個運行檢查,你應該做的:
clazz.isInstance(obj)
這個擁有超過clazz.isAssignableFrom(..)
小的優勢,因爲它用的情況下obj == null
更好的交易。
首先,instanceof
要求右邊的操作數是一個實際的類(例如或obj instanceof Integer
),而不是Class
類型的變量。其次,你已經取得了相當普遍的新手的錯誤,你真的不應該做的......以下模式:
if (conditional_expression){ return true; } else{ return false; }
以上可重構爲:
return conditional_expression;
你應該總是執行重構,因爲它消除了冗餘if ... else語句。類似地,表達式return conditional_expression ? true : false;
可重構爲相同的結果。
這沒有錯。也許笨拙,但總體還可以。也許你在可預見的將來返回之前需要額外的代碼... – 2017-06-13 09:59:11
正如其他人所說,你不能在一個類變量傳遞給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
我知道代碼是完全無用,我只是想表明我的困惑:) – eric2323223 2010-04-07 07:37:10
'整數'是**不是**類的文字。 '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
我會使用'clazz.isInstance(obj)',因爲對象已經提供了。 – 2010-04-07 08:09:21