首页 > 解决方案 > 如何遍历 Object 引用的数组?

问题描述

我有一个基于识别字符串get(String)返回的函数。Object

有时,Object返回的 fromget是一个数组。如果是这样,我想遍历每个数组元素并以某种方式处理该元素。类似于以下代码。

 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都可以为所有阵列工作吗?

标签: javaarraysobject

解决方案


使用java.lang.reflect.Array是关键。如果您有一个Objectwhich 实际上是某种类型的数组(原始、字符串或某种自定义类型等),您可以在不知道其类型或进行类型转换等的情况下迭代、打印等。

由于元素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 + '\'' +
                    '}';
        }
    }
}

推荐阅读