在使用以下命令时是否存在偏好或行为差异:
if(obj.getClass().isArray()) {}
和
if(obj instanceof Object[]) {}
发布于 2008-10-20 21:24:02
在大多数情况下,应该使用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
抛出NullPointerException
。
应用于基元数组时,除非右操作数上的组件类型与组件类型完全匹配,否则instanceof
将生成false
。相反,对于任何组件类型,isArray()
都将返回true
。
发布于 2008-10-20 20:59:46
在后一种情况下,如果obj为null,则不会得到NullPointerException,而是false。
发布于 2008-10-21 12:16:06
如果obj
是int[]
类型,那么它将有一个数组Class
,但不是Object[]
的实例。那么你想用obj
做什么呢?如果要对其进行造型,请使用instanceof
。如果你打算使用反射,那么就使用.getClass().isArray()
。
https://stackoverflow.com/questions/219881
复制相似问题