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