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()似乎更相关。