edb*_*ras 91 java arrays gwt instanceof
如果Object是不使用反射的数组,我如何在Java中看到?如何在不使用反射的情况下迭代所有项目?
我使用谷歌GWT所以我不允许使用反射:(
我想在不使用refelection的情况下实现以下方法:
private boolean isArray(final Object obj) {
//??..
}
private String toString(final Object arrayObject) {
//??..
}
Run Code Online (Sandbox Code Playgroud)
顺便说一句:我也不想使用JavaScript,以便我可以在非GWT环境中使用它.
Ste*_*Kuo 235
您可以使用 Class.isArray()
public static boolean isArray(Object obj)
{
return obj!=null && obj.getClass().isArray();
}
Run Code Online (Sandbox Code Playgroud)
这适用于对象和基本类型数组.
对于toString来看看Arrays.toString.您必须检查数组类型并调用适当的toString方法.
pol*_*nts 65
你可以用instanceof.
instanceofRun Code Online (Sandbox Code Playgroud)RelationalExpression: RelationalExpression instanceof ReferenceType在运行时,
instanceof运算符的结果是true如果RelationalExpression的值不是,null并且可以将引用强制转换为ReferenceType而不引发aClassCastException.否则结果是false.
这意味着你可以这样做:
Object o = new int[] { 1,2 };
System.out.println(o instanceof int[]); // prints "true"
Run Code Online (Sandbox Code Playgroud)
你不得不检查对象是instanceof boolean[],byte[],short[],char[],int[],long[],float[],double[],或者Object[],如果你想检测所有数组类型.
另外,a int[][]是一个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 //...
}
Run Code Online (Sandbox Code Playgroud)
它将是非常重复的(但即使java.util.Arrays是非常重复),但这就是Java中使用数组的方式.
use*_*596 32
可以使用以下代码分别访问数组的每个元素:
Object o=...;
if ( o.getClass().isArray() ) {
for(int i=0; i<Array.getLength(o); i++){
System.out.println(Array.get(o, i));
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,没有必要知道它是什么类型的底层数组,因为这适用于任何数组.
原始类型的数组之间或基本类型的数组与引用类型的数组之间不存在子类型关系.见JLS 4.10.3.
因此,以下是不正确的测试,看看是否obj是任何类型的数组:
// INCORRECT!
public boolean isArray(final Object obj) {
return obj instanceof Object[];
}
Run Code Online (Sandbox Code Playgroud)
具体来说,如果obj是1-D基元数组则不起作用.(它确实适用于具有更高维度的原始数组,因为所有数组类型都是子类型Object.但在这种情况下它没有实际意义.)
我使用谷歌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[];
}
Run Code Online (Sandbox Code Playgroud)您还可以尝试使用对象类的名称,如下所示,但调用obj.getClass()接近反射.
public boolean isArray(final Object obj) {
return obj.getClass().toString().charAt(0) == '[';
}
Run Code Online (Sandbox Code Playgroud)1 - 更确切地说,该Class.isArray方法在本页中列为GWT支持的方法.