Answers:
您可以使用instanceof
。
instanceof
RelationalExpression: RelationalExpression instanceof ReferenceType
在运行时,
instanceof
运算符的结果是:true
如果RelationalExpression的值不是null
,并且引用可以强制转换为ReferenceType而不引发ClassCastException
。否则结果为false
。
这意味着您可以执行以下操作:
Object o = new int[] { 1,2 };
System.out.println(o instanceof int[]); // prints "true"
你不得不检查对象是instanceof boolean[]
,byte[]
,short[]
,char[]
,int[]
,long[]
,float[]
,double[]
,或者Object[]
,如果你想检测所有数组类型。
另外,an int[][]
是an instanceof Object[]
,因此取决于您要如何处理嵌套数组,它可能会变得复杂。
对于toString
,java.util.Arrays
有toString(int[])
,你可以用其他重载。它还具有deepToString(Object[])
用于嵌套数组的功能。
public String toString(Object arr) {
if (arr instanceof int[]) {
return Arrays.toString((int[]) arr);
} else //...
}
这将是非常重复的(但甚至java.util.Arrays
是非常重复的)),但这就是Java中带有数组的方式。
java.util.Arrays
,是的。我发现您一直在阅读我链接到的代码。
可以使用以下代码分别访问数组的每个元素:
Object o=...;
if ( o.getClass().isArray() ) {
for(int i=0; i<Array.getLength(o); i++){
System.out.println(Array.get(o, i));
}
}
注意,不必知道它是哪种底层数组,因为它适用于任何数组。
isArray()
在此之前4年发布的答案中已经充分涵盖了该答案。
基本类型的数组之间,基本类型的数组与引用类型的数组之间没有子类型关系。参见JLS 4.10.3。
因此,以下是不正确的测试,以查看是否obj
为任何类型的数组:
// INCORRECT!
public boolean isArray(final Object obj) {
return obj instanceof Object[];
}
具体来说,如果obj
是图元的一维数组,则不起作用。(尽管它确实适用于具有更高维的基本数组,因为所有数组类型都是。的子类型,Object
但是在这种情况下,它没有意义。)
我使用Google GWT,所以我不允许使用反射:(
最佳解决方案(针对问题的isArray
数组部分)取决于什么才算是“使用反射”。
在GWT中,调用obj.getClass().isArray()
不算作使用反射1,因此这是最佳解决方案。
否则,弄清楚对象是否具有数组类型的最佳方法是使用instanceof
表达式序列。
public boolean isArray(final Object obj) {
return obj instanceof Object[] || obj instanceof boolean[] ||
obj instanceof byte[] || obj instanceof short[] ||
obj instanceof char[] || obj instanceof int[] ||
obj instanceof long[] || obj instanceof float[] ||
obj instanceof double[];
}
您还可以尝试按如下方式弄乱对象的类名,但对的调用obj.getClass()
正处于反射中。
public boolean isArray(final Object obj) {
return obj.getClass().toString().charAt(0) == '[';
}
1 -更准确地说,Class.isArray
被列为方法,通过GWT在支持此页面。
您可以创建一个实用程序类来检查该类是否表示任何Collection,Map或Array
public static boolean isCollection(Class<?> rawPropertyType) {
return Collection.class.isAssignableFrom(rawPropertyType) ||
Map.class.isAssignableFrom(rawPropertyType) ||
rawPropertyType.isArray();
}
obj.getClass().getComponentType()
。