Java TypeUtils说;空";是“的实例”;对象。类“;?

Java TypeUtils说;空";是“的实例”;对象。类“;?,java,apache,apache-commons,Java,Apache,Apache Commons,关于下面的代码org.apache.commons.lang3.reflect.TypeUtils说null是一种Object.class类型。这不是不对吗 public static void main(String args[]) { Boolean bool = null; if (TypeUtils.isInstance(bool, Object.class)) { System.out.println("bool isInstance Object-

关于下面的代码
org.apache.commons.lang3.reflect.TypeUtils
null
是一种
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");
    }


}
没错。报告说:

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

由于可以将
null
赋值给
Object
类型的变量,因此返回true

如果没有这些文档,我认为您是正确的,因为
null
意味着不存在实例,无论类型如何。

这是预期的行为(


该方法只是检查是否可以为对象分配null,我想它将返回true。

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

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

而null不是对象类的实例,因为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);
}
公共静态布尔值isInstance(最终对象值,最终类型){
if(type==null){
返回false;
}
返回值==null?!(类型instanceof Class)| |!((类)类型)。isPrimitive()
:isAssignable(value.getClass(),类型,null);
}

如果我们将此方法的命名与“它正在做的工作”相一致,那就太好了。这样的方法名称很容易在应用程序中引入错误,因为它具有误导性。尽管我阅读了文档,但它并没有让我意识到像“null”这样的边界条件.这是我的错误,我同意,但我认为还有改进的余地,也许可以将其重命名为isAssignable()。这样,我们可以缩小误差幅度。我同意你的看法。我注意到isAssignable()在该类中多次重载。我的印象是,当参数是实例时(在所有isAssignable()中,参数中只使用类型),类作者会进行区分,但这非常尴尬,因为会产生误导。isAssignable()应该足以满足所有情况。如果需要区分,isTypeAssignable()isInstanceAssignable()似乎更相关。