前一陣子打程式碼的時候突然想到一個問題。平常我們的陣列都是作為一個參數傳入方法中的,如果我們要想在方法中建立一個陣列呢?在類型明確的情況下,這是沒什麼難度的。如果我們傳入的參數是泛型類型的參數呢?
public static <T> T[] creArray (T obj){ T[] arr = new T[10]; }
像上面這種用T來直接new陣列的方法是錯誤的,會編譯時出現一個:Cannot create a generic array of T. 的錯誤。 java中不支援未知的類型直接建立數組。
最後我得到了這樣一個完美的解決方法:
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; } }
程式碼輸出如下:
##上述的方法是完全可行的,我們透過用Array類別的newInstance方法來建構了可指定類型的陣列。使用反射來完成這個工作也應該是在情理之中。因為泛型類型T在中運行時才可能被確定下來,我們能創建泛型數組也必然是在java運行時想辦法,在java運行時能起作用的技術莫過於反射。 另外看見null,剛好在這裡也整理一下java中不同型別數組初始化的值情況:ccc //方法中输出的arr[1] null //以下5个是main中循环迭代出的数组值 ccc null null null登入後複製登入後複製
前一陣子打程式碼的時候突然想到一個問題。平常我們的陣列都是作為一個參數傳入方法中的,如果我們要想在方法中建立一個陣列呢?在類型明確的情況下,這是沒什麼難度的。如果我們傳入的參數是泛型類型的參數呢?
- 基本型別(數值型):0
- 基本型別(布林型):false
- #基本型別(char型):(char)0
- #物件類型: null
public static <T> T[] creArray (T obj){ T[] arr = new T[10]; }
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; } }
ccc //方法中输出的arr[1] null //以下5个是main中循环迭代出的数组值 ccc null null null
##上述的方法是完全可行的,我們透過用Array類別的newInstance方法來建構了可指定類型的陣列。使用反射來完成這個工作也應該是在情理之中。因為泛型類型T在中運行時才可能被確定下來,我們能創建泛型數組也必然是在java運行時想辦法,在java運行時能起作用的技術莫過於反射。
另外看見null,剛好在這裡也整理一下java中不同型別數組初始化的值情況:
基本型別(數值型):0
- 基本型別(布林型):false
- #基本型別(char型):(char)0
- #物件類型: nul