需求:一個方法傳入的參數是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,這樣做使用到了多態,因此無論我們傳入的是對象類型數組還是基本類型數組都可以進行迭代。
