Class#isAssignableFrom和unboxing / boxing

时间:2013-12-03 19:02:47

标签: java reflection types

众所周知,Class#isAssignable并未考虑,值可以自动装箱/取消装箱。例如。以下四个案例中较低的一个返回false

// 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。)如果不是,那么对所有原始/包裹组合实现这一点的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

此方法是关于子类型的,而不是是否可以将一个值分配给变量,这要复杂得多,请参阅http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.2

答案 1 :(得分: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));