2013-12-03 64 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