TypeUtils 说 "null" 是 "Object.class" 的实例?

TypeUtils says "null" is instance of "Object.class"?

关于以下代码 org.apache.commons.lang3.reflect.TypeUtilsnullObject.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");
    }


}

没错。 function's documentation 表示如下:

Checks if the given value can be assigned to the target type following the Java generics rules.

并且由于您可以将 null 分配给 Object 类型的变量,因此 returns 正确。

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

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

该方法只是检查是否可以将 null 分配给 Object ,我猜它 return 是真的。

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

Checks if the given value can be assigned to the target type following the Java generics rules.

并且 null 不是 Object class 的实例,因为 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);
}