前言:
前一陣子打代碼的時候突然想到一個問題。平時我們的數組都是作為一個參數傳入方法中的,如果我們要想在方法中創建一個數組怎么樣呢?在類型明確的情況下,這是沒什么難度的。如果我們傳入的參數是泛型類型的參數呢?
1
2
3
|
public static <T> T[] creArray (T obj){ T[] arr = new T[ 10 ]; } |
像上面這種用T來直接new數組的方法是錯誤的,會編譯時出現一個:Cannot create a generic array of T. 的錯誤。Java中不支持未知的類型直接創建數組。
最后我得到了這樣一個完美的解決方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
package Test; import java.lang.reflect.Array; /** * * @author QuinnNorris * 在泛型方法中創建泛型類型的數組 */ public class Test { public static void main(String[] args) { // TODO Auto-generated method stub String a = "ccc" ; //創建一個String,作為泛型類型 String[] ar = creArray(a); for (String art :ar) //循環打印 System.out.println(art); } //泛型靜態方法 public static <T> T[] creArray (T obj){ T[] arr = (T[])Array.newInstance(obj.getClass(), 5 ); arr[ 1 ] = obj; System.out.println(arr[ 1 ]); return arr; } } |
代碼輸出如下:
1
2
3
4
5
6
|
ccc //方法中輸出的arr[1] null //以下5個是main中循環迭代出的數組值 ccc null null null |
上述的方法是完全可行的,我們通過用Array類的newInstance方法來構造了可指定類型的數組。使用反射來完成這個工作也應該是在情理之中。因為泛型類型T在中運行時才可能被確定下來,我們能創建泛型數組也必然是在java運行時想辦法,在java運行時能起作用的技術莫過于反射。
另外看見null,正好在這里也整理一下java中不同類型數組初始化的值情況:
基本類型(數值型):0
基本類型(布爾型):false
基本類型(char型):(char)0
對象類型: null
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
原文鏈接:http://blog.csdn.net/quinnnorris/article/details/55520353