如果一个Object对象可能是数组那么如何对其进行迭代
需求:一个方法传入的参数是Object类型(假设对象为“items”,使用Object类型也是为了使用多态而增加方法复用性),但已知这个Object对象可能是基本类型数组,也可能是对象数组,如何将这个对象中的数组元素进行迭代,同时添加进一个集合中(我们不关心添加迭代出来的值是什么类型)。
分析:如果想将一个数组迭代添加进一个集合中,那么我们最可能想到是的使用数组工具类Arrays的asList(T…a)方法:
但是这个方法的不足之处在于,对于对象数组,可以将对象数组中的每个元素迭代添加到一个List集合中,但是对于基本类型数组,由于数组中的每个元素并不是对象,所以在返回的List集合中只是保存基本类型数组的对象(即该基本类型数组的hashcode)。
解决:
首先判断方法传入Object类型(假设对象为“items”)的参数是否真的是数组。这里要使用反射,在Class类中有“isArray”方法可以满足次需求:
接着使用数组类Array,既然是数组类,那么Array必定封装了操作数组的方法,无论是对象类型数组还是基本类型数组,这里我们要对这个对象(“items”,Object类型)进行迭代,那么只需要使用数组类Array中的getLength(Object array)方法和get(Object array, int index)即可。
代码:
1 public Collection setItems(Object items) { 2 if(items.getClass().isArray()) { 3 4 Collection coll = new ArrayList(); 5 int length = Array.getLength(items); 6 7 for(int i=0;i<length;i++) { 8 Object value = Array.get(items, i); 9 coll.add(value); 10 } 11 return coll; 12 }else{ 13 throw new RuntimeException("items is not Array"); 14 } 15 }
应用1:
1 int[] arr = {1,2,3,4,5}; 2 System.out.println(setItems(arr));
结果:[1, 2, 3, 4, 5]
应用2:
1 String[] arr = {"long","live","sd"}; 2 System.out.println(setItems(arr));
结果:[long, live, sd]
从上面两个应用可以看到,在我们的方法参数设置为Object,这样做使用到了多态,因此无论我们传入的是对象类型数组还是基本类型数组都可以进行迭代。