isAssignable来自引用和基元类型

2022-09-03 01:39:55

我想更好地了解 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,以及这里适当的测试是什么?


答案 1

实际上无法为变量赋值 - 但您可以从 转换为使用自动装箱。booleanBooleanbooleanBoolean

JavaDocs将规则非常清晰:

确定此 Class 对象所表示的类或接口是否与指定的 Class 参数所表示的类或接口相同,或者是否是其超类或超接口。如果是这样,则返回 true;否则,它将返回 false。如果此 Class 对象表示基元类型,则当指定的 Class 参数恰好是此 Class 对象时,此方法返回 true;否则,它将返回 false。


答案 2

1.4 中的 javadocs 已经指定:

如果此 Class 对象表示基元类型,则当指定的 Class 参数恰好是此 Class 对象时,此方法返回 true;否则,它将返回 false。

因此,在引入自动装箱之前,此方法的行为已锁定到位,并且无法更改(必须引入新方法)。

鉴于此 bug 报告,很明显,并非所有围绕 Class 对象的边缘情况以及自动装箱更改期望的方式都得到了完全处理。

为了回答你问题的第二部分,我知道测试这种情况的唯一方法是一系列if语句或一些类似的解决机制,这些机制“框”了基元类类型。