我有一个函数get(String)
,该函数根据标识字符串返回一个Object
。
有时,从Object
返回的get
是一个数组。如果是这样,我想遍历每个数组元素并以某种方式处理该元素。类似于以下代码。
Object object = get(identifier);
if(object.getClass().isArray())
processArray(object);
void processArray(Object array) {
//For each element in the array, do something
}
我对此的尝试解决方案
void processArray(Object array) {
Object[] arrayCasted = (Object[]) array;
for(Object arrayElement : arrayCasted)
//Process each element somehow
}
但这仅适用于对象数组(不适用于基本数组)
Integer[] test1 = {1, 2, 3};
int[] test2 = {1, 2, 3};
processArray(test1); //Works
processArray(test2); //Does not work: ClassCastException
总有没有办法使processArray
对所有数组都起作用?
答案 0 :(得分:3)
使用java.lang.reflect.Array
是关键。如果您有一个Object
实际上是某种类型(原始,字符串或某些自定义类型等)的数组,则可以遍历,打印等,而无需知道其类型或进行类型转换等。>
由于元素不是Object[]
类型,因此无法进行类型转换到Object
,但是,您可以通过知道其组件类型(obj.getClass().getComponentType()
)将类型转换为特定的数组类型。但是,基于java.lang.reflect.Array
的解决方案更加简洁。
import java.lang.reflect.Array;
public class ArrayOfUnknownType {
public static void main(String[] args) {
int[] i = {1, 2, 3};
String[] s = {"a", "b", "c"};
Dog[] d = {new Dog("d"), new Dog("e")};
process(i);
process(s);
process(d);
}
private static void process(Object data) {
System.out.println(data.getClass().getComponentType());
if(data.getClass().isArray()) {
int length = Array.getLength(data);
for(int count =0; count < length; count++ ){
System.out.println(Array.get(data, count));
}
}
}
private static class Dog {
public String name;
public Dog(String name) {
this.name = name;
}
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
'}';
}
}
}