使用时是否存在偏好或行为差异:
if(obj.getClass().isArray()) {}
和
if(obj instanceof Object[]) {}
?
在大多数情况下,您应该使用instanceof
运算符来测试对象是否是数组.
通常,在向下转换为编译时已知的特定类型之前测试对象的类型.例如,也许您编写了一些可以使用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
抛出a NullPointerException
.
施加到一个原始阵列,所述instanceof
产量false
除非在右边的操作数的组件类型完全分量类型相匹配.相反,isArray()
将返回true
任何组件类型.
在后一种情况下,如果obj为null,则不会出现NullPointerException而是false.
如果obj
是类型int[]
说,那么将有一个数组Class
但不是一个实例Object[]
.那你想做什么obj
.如果你要施展它,那就去吧instanceof
.如果您打算使用反射,请使用.getClass().isArray()
.
我最近遇到了将Groovy应用程序从JDK 5升级到JDK 6的问题.isArray()
在JDK6中使用失败:
MissingMethodException: No signature of sun.reflect.generics.reflectiveObjects.GenericArrayTypeImpl.isArray() ...
改为instanceof Object[]
固定这个.