您如何遍历Object引用的数组?

时间:2019-08-18 00:35:38

标签: java arrays object

我有一个函数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对所有数组都起作用?

1 个答案:

答案 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 + '\'' +
                    '}';
        }
    }
}