[英]Why does Integer.class.isInstance(i) return true while int.class.isInstance(i) and Integer.TYPE.isInstance(i) return false?
[英]Is int.class.isInstance(Object) a contradiction?
這是一個例子:
public boolean check(Class<?> clazz, Object o)
{
return clazz.isInstance(o);
}
check(int.class, 7); // returns false
由於isInstance
接受一個Object
,因此它不能與int
,因為int
是一個基本類型並被自動裝箱到Integer
。 那么是否可以編寫通用的檢查方法? 或者我應該確保clazz屬於Class<? extends Object>
Class<? extends Object>
?
並非所有Class
對象都表示類/引用類型; 還有表示基本類型的Class
對象。 這很有用,因為在使用帶有字段和方法的反射時,通常需要指定它們的類型,它可以是基本類型。 所以Class
用於表示所有這些pre-generics類型。
但是, Class
類的許多方法對原始類型沒有意義。 例如,對象不可能是instanceof int
。 因此,類似的.isInstance()
方法將始終返回false
。 由於該方法的參數是Object
類型,因此從語言的角度來看,傳遞給它的是原始類型是不可能的。
當然,在Java 5+中,當您將原語傳遞給Object
類型的參數時,它會進行自動裝箱,但它經歷了自動裝箱這一事實意味着傳遞的內容實際上是對對象的引用。 引用類型和基元類型是不同的。 參數是引用類型或基本類型。 因此,您無法編寫可以采用“引用或原語”的方法。
在您的示例中,您可能要問的是檢測對象是否從基元自動裝箱,並將其與基本類型進行比較。 但是,無法檢測呼叫者是否對其進行了自動裝箱,因為自動裝箱是在呼叫之前發生的完全呼叫方操作。
但是,假設它是自動裝箱的,你知道應該去哪種類型。 如果您期望一個int
,並且它被自動裝箱並傳遞給您的方法,那么它應該是Integer
一個實例。 因此,您可以做的是,當clazz
表示基本類型時,而是對其包裝類執行檢查。 因此,當它看到clazz
是int.class
,用Integer.class
替換它,然后執行檢查。 請注意,這種方式仍然無法判斷作為o
參數傳遞的內容是否已自動裝箱。
Java中沒有int
類。 它的Integer
類。 7
將轉換為Integer.valueOf(7)
,並且int.class
將根據JLS轉換為Integer.class
。
如果
p
是基本類型的名稱,則讓B
為拳擊轉換后類型p
的表達式的類型。 那么p.class
的類型是Class<B>
。
由於Integer
是一個類對象,而int
是原始類型。 因此,大多數Class
方法,如isInstance
, isAssignableFrom
等操作對象在int.class
的上下文中都是無效的,因此你會看到這種矛盾。
check(Integer.class, 7);
應給出預期的結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.