我想更好地理解基元和引用类型之间的Java中的isAssignableFrom行为。
例如:
System.out.println(boolean.class.isAssignableFrom(Boolean.class)); // false
System.out.println(Boolean.class.isAssignableFrom(boolean.class)); // false
boolean primitive;
Boolean referenceType = true;
primitive = referenceType;
System.out.println(primitive); // true
我知道在分配基元时< - >根据需要引用装箱/拆箱,但我认为因此isAssignableFrom会在上面的前两个例子中返回true。
有人可以解释为什么它返回false,这里适当的测试是什么?
答案 0 :(得分:14)
您无法实际为boolean
变量分配Boolean
值 - 但您可以将从boolean
转换为 Boolean
使用自动装箱。
JavaDocs使规则非常明确:
确定类或接口 由这个Class对象表示的是 要么是相同的,要么是超类 或者是类或者的超级接口 由指定的接口表示 类参数。如果是,则返回true 所以;否则返回false。如果 这个Class对象代表一个 原始类型,此方法返回 如果指定的Class参数为true 正是这个Class对象; 否则返回false。
答案 1 :(得分:7)
如果此Class对象表示基本类型,则如果指定的Class参数恰好是此Class对象,则此方法返回true;否则返回false。
因此,在引入自动装箱之前,此方法的行为已锁定,并且无法更改(必须引入新方法)。
鉴于此bug report,很明显并非所有围绕Class对象的边缘情况以及自动装箱如何改变期望都已完全处理。
为了回答你问题的第二部分,我知道测试这个案例的唯一方法是一系列if语句或一些类似的解析机制来“封装”基本类类型。