簡體   English   中英

為什么我不能在 Java 中創建泛型數組?

[英]Why can't I create generic array in Java?

我在創建一些 arrays 時遇到問題。

這是代碼

Predicate<Integer>[] endOfLine = {
    curPoint -> curPoint[0]==r2,
    curPoint -> curPoint[0]==c2,
    curPoint -> curPoint[0]==r1,
    curPoint -> curPoint[0]==c1
};
Consumer<Integer[]>[] move = {
    curPoint -> { curPoint[0]++; },
    curPoint -> { curPoint[1]++; },
    curPoint -> { curPoint[0]--; },
    curPoint -> { curPoint[1]--; }            
};

和 eclipse (也許是編譯器?)說:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    Cannot create a generic array of Predicate<Integer[]>

我google了一下,發現不能在Java中制作泛型類型參數數組。

我閱讀了有關編譯時間和運行時的信息,我認為這可能不是我的問題。

我看到了一些編譯編譯的代碼:

List<Integer>[] arrayOfLists = new ArrayList[2];
ArrayList<Integer[]> lists =new ArrayList<>();
ArrayList<Consumer []> [] lists = new ArrayList[5];
        
Predicate<Integer[]>[] p = new Predicate[5];
p[0] = a -> a[0] == 0;

Predicate<Integer[]>[] pp = { a -> a[0] == 0 }; //cant be compile

我閱讀了 oracle 文檔並發現了這個:

“無法創建參數化類型的 Arrays”

我總結了我的快捷語法,{} 是問題所在。 快捷語法創建具有參數化類型的代碼。 這個對嗎?

您不能在 Java 中創建通用數組。 Arrays 是可具體化的類型,在運行時攜帶其類型信息,而 generics 是不可具體化的,其類型信息在編譯后由於擦除而被擦除。 這是由於在 java 中實現了類型系統,盡管這會導致一些粗糙的邊緣和角落情況,但它簡化了代碼向 generics 的演變。 由於泛型類型信息被擦除,您在運行時沒有它們,這就是為什么您不能在 java 中創建泛型數組的原因。

有兩種解決方案。 您可以創建一個 Object 數組並將其轉換為您需要的泛型類型。 如果您不返回此內部數組,則此方法有效。

final T[] arr = (T[]) new Object[n]

要不然

final Object[] arr = new Object[]

當你像這樣從這個數組中獲取項目時,你可以進行演員表

T itm = (T) arr[1];

但是,如果您要返回此內部數組,則需要以反射方式創建它,因為您需要維護正確的可具體化類型。

static <T> T[] createArr(Class<T> clz) {
    return (T[]) Array.newInstance(clz, 5);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM