首頁 > Java > java教程 > java—用泛型參數型別建構數組

java—用泛型參數型別建構數組

黄舟
發布: 2017-03-01 11:44:04
原創
1990 人瀏覽過


前一陣子打程式碼的時候突然想到一個問題。平常我們的陣列都是作為一個參數傳入方法中的,如果我們要想在方法中建立一個陣列呢?在類型明確的情況下,這是沒什麼難度的。如果我們傳入的參數是泛型類型的參數呢?

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;
    }
}
登入後複製
登入後複製

程式碼輸出如下:

ccc    //方法中输出的arr[1] 

  null    //以下5个是main中循环迭代出的数组值 

  ccc 

  null 

  null 

  null
登入後複製
登入後複製


##上述的方法是完全可行的,我們透過用Array類別的newInstance方法來建構了可指定類型的陣列。使用反射來完成這個工作也應該是在情理之中。因為泛型類型T在中運行時才可能被確定下來,我們能創建泛型數組也必然是在java運行時想辦法,在java運行時能起作用的技術莫過於反射。

另外看見null,剛好在這裡也整理一下java中不同型別數組初始化的值情況:

  1. 基本型別(數值型):0

  2. 基本型別(布林型):false

  3. #基本型別(char型):(char)0

  4. #物件類型: null

前一陣子打程式碼的時候突然想到一個問題。平常我們的陣列都是作為一個參數傳入方法中的,如果我們要想在方法中建立一個陣列呢?在類型明確的情況下,這是沒什麼難度的。如果我們傳入的參數是泛型類型的參數呢?

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;
    }
}
登入後複製
登入後複製

程式碼輸出如下:

ccc    //方法中输出的arr[1] 

  null    //以下5个是main中循环迭代出的数组值 

  ccc 

  null 

  null 

  null
登入後複製
登入後複製


##上述的方法是完全可行的,我們透過用Array類別的newInstance方法來建構了可指定類型的陣列。使用反射來完成這個工作也應該是在情理之中。因為泛型類型T在中運行時才可能被確定下來,我們能創建泛型數組也必然是在java運行時想辦法,在java運行時能起作用的技術莫過於反射。

另外看見null,剛好在這裡也整理一下java中不同型別數組初始化的值情況:

    基本型別(數值型):0
  1. 基本型別(布林型):false
  2. #基本型別(char型):(char)0
  3. #物件類型: nul

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板