首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 泛型建立陣列:反射解決 Cannot create a generic array of T 問題

     編輯:Java 相關知識

問題背景

在泛型方法中直接 new T[10] 會編譯報錯:Cannot create a generic array of T。Java 執行期類型擦除導致無法確定具體類型,故不支援直接建立泛型陣列。

錯誤示範

public static <T> T[] creArray(T obj) {
    T[] arr = new T[10]; // 編譯錯誤
    return arr;
}

完美解法:反射 Array.newInstance()

import java.lang.reflect.Array;

public static <T> T[] creArray(T obj) {
    // 根據傳入物件的實際類型建立陣列
    T[] arr = (T[]) Array.newInstance(obj.getClass(), 5);
    arr[1] = obj;
    System.out.println(arr[1]); // 輸出: ccc
    return arr;
}

完整可執行範例

public class Test {
    public static void main(String[] args) {
        String a = "ccc";
        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         // main 中迭代輸出:arr[0]
ccc          // arr[1]
null         // arr[2]
null         // arr[3]
null         // arr[4]

核心原理

  • 泛型類型 T 執行期才確定,需用反射在執行期動態建立陣列
  • Array.newInstance(Class<?> componentType, int length) 可指定元件類型與長度
  • 傳入物件的 getClass() 取得實際 Class 物件

補充:Java 陣列預設值速查

類型預設值
數值型0
布林型false
字元型'\u0000'
物件型null
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved