2013-12-03 68 views
4

我們知道,Class#isAssignable不考慮,一個值可以自動裝盒/拆箱。例如。以下四種情況下,較低的回報false類別#isAssignable來源和拆箱/裝箱

// obvious 
System.out.println(boolean.class.isAssignableFrom(boolean.class)); // true 
System.out.println(Boolean.class.isAssignableFrom(Boolean.class)); // true 


// boxing/unboxing 
System.out.println(boolean.class.isAssignableFrom(Boolean.class)); // false 
System.out.println(Boolean.class.isAssignableFrom(boolean.class)); // false 

是否有這個方法,它會考慮這種情況下的預先存在的變種? (即,在上述所有四種給定情況下返回true)。如果不是,那麼對於所有原始/包裝組合實現這一點的最佳方式是什麼?

+0

什麼是你的使用情況?無論如何,你永遠無法在'boolean'上調用'getClass()'。 –

+0

@SotiriosDelimanolis他可能會,boolean.class(或Boolean.TYPE)可能會使用反射類型傳遞。 –

+0

@arne這些都是afaik,它是獲取'boolean'類對象的唯一方法。所以我沒有看到在運行時知道這些信息的有用性。 –

回答

1

我有一個WRAPPER_MAP字段是這樣的。

WRAPPER_MAP.put(boolean.class, Boolean.class); 
// add others 

然後我看看這個。

public static Class wrap(Class clazz) { 
    Class clazz2 = WRAPPER_MAP.get(clazz); 
    return clazz2 == null ? clazz : clazz2; 
} 

然後測試

wrap(clazz1).isAssignableFrom(wrap(clazz2)); 
+0

雖然這確實得到了所要求的行爲,但是使用'isAssignableFrom'是imo,因爲它的意思是不恰當的。 'boolean'不是'Boolean'的相同類或超類。 –

+0

謝謝,這就是我一直在尋找的東西。順便說一下,我發現Apache Commons''org.apache.commons.lang3.ClassUtils''爲這種情況提供了一些有用的方法(''#isAssignable'')。 @SotiriosDelimanolis我明白,嚴格來說'可轉讓'可能不正確,但在我的用例中,我需要這種行爲。 – qqilihq