在使用以下各项之间是否存在偏好或行为差异:
if(obj.getClass().isArray()) {}
和
if(obj instanceof Object[]) {}
?
在使用以下各项之间是否存在偏好或行为差异:
if(obj.getClass().isArray()) {}
和
if(obj instanceof Object[]) {}
?
在大多数情况下,应该使用instanceof
运算符来测试对象是否为array.
通常,在向下转换到编译时已知的特定类型之前,需要测试对象的类型.例如,您可能编写了一些可以使用Integer[]
或int[]
的代码.你想用instanceof
来保护你的演员阵容:
if (obj instanceof Integer[]) {
Integer[] array = (Integer[]) obj;
/* Use the boxed array */
} else if (obj instanceof int[]) {
int[] array = (int[]) obj;
/* Use the primitive array */
} else ...
在JVM级别,instanceof
运算符转换为特定的"instanceof"字节代码,这在大多数JVM实现中都得到了优化.
在更罕见的情况下,您可能会使用反射来遍历未知类型的对象图.在这种情况下,isArray()
方法可能会有所帮助,因为您在编译时不知道组件类型;例如,您可能正在实现某种序列化机制,并且能够将数组的每个组件传递给同一个序列化方法,而不考虑类型.
有两种特殊情况:空引用和对基元数组的引用.
空引用将导致instanceof
返回false
,而isArray
抛出NullPointerException
.
如果将instanceof
应用于基元数组,则除非右侧操作数上的组件类型与组件类型完全匹配,否则instanceof
将产生false
.相反,对于任何组件类型,isArray()
将返回true
.