TypeUtils说“null”是“Object.class”的实例?

时间:2016-08-08 09:24:16

标签: java apache apache-commons

关于以下代码org.apache.commons.lang3.reflect.TypeUtilsnull是一种Object.class。这不正确吗?

public static void main(String args[]) {

    Boolean bool = null;

    if (TypeUtils.isInstance(bool, Object.class)) {
        System.out.println("bool isInstance Object-true");
    } else {
        System.out.println("bool isInstance Object-false");
    }


}

3 个答案:

答案 0 :(得分:2)

这是对的。 function's documentation说明如下:

  

检查是否可以将给定值分配给以下目标类型   Java泛型规则。

由于您可以将null分配给Object类型的变量,因此返回true。

如果没有该文档,我认为你是正确的,因为null表示没有实例,无论类型如何。

答案 1 :(得分:1)

这是预期的行为(https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/reflect/TypeUtils.html#isInstance(java.lang.Object,%20java.lang.reflect.Type)

该方法只是检查是否可以为Object分配null,它会返回true我猜。

答案 2 :(得分:1)

我同意你的看法。 isInstance()方法具有误导性。 它应该是isAssignable(),因为文档指出:

  

检查是否可以将给定值分配给以下目标类型   Java泛型规则。

并且null不是Object类的实例,因为null不是实例。

但根据文档,您的结果是准确的,因为null可以分配给任何对象类型。 当您查看实现时,您可以看到代码调用isAssignable()方法:

public static boolean isInstance(final Object value, final Type type) {
    if (type == null) {
        return false;
    }

    return value == null ? !(type instanceof Class<?>) || !((Class<?>) type).isPrimitive()
            : isAssignable(value.getClass(), type, null);
}