簡體   English   中英

int.class.isInstance(Object)是一個矛盾嗎?

[英]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表示基本類型時,而是對其包裝類執行檢查。 因此,當它看到clazzint.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方法,如isInstanceisAssignableFrom等操作對象在int.class的上下文中都是無效的,因此你會看到這種矛盾。

check(Integer.class, 7);

應給出預期的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM