isAssignableFrom with reference和primitive类型

时间:2009-10-30 15:45:46

标签: java generics types

我想更好地理解基元和引用类型之间的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,这里适当的测试是什么?

2 个答案:

答案 0 :(得分:14)

您无法实际boolean变量分配Boolean值 - 但您可以boolean转换为 Boolean使用自动装箱。

JavaDocs使规则非常明确:

  

确定类或接口   由这个Class对象表示的是   要么是相同的,要么是超类   或者是类或者的超级接口   由指定的接口表示   类参数。如果是,则返回true   所以;否则返回false。如果   这个Class对象代表一个   原始类型,此方法返回   如果指定的Class参数为true   正是这个Class对象;   否则返回false。

答案 1 :(得分:7)

javadocs from 1.4已指定:

  

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

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

鉴于此bug report,很明显并非所有围绕Class对象的边缘情况以及自动装箱如何改变期望都已完全处理。

为了回答你问题的第二部分,我知道测试这个案例的唯一方法是一系列if语句或一些类似的解析机制来“封装”基本类类型。