![](/img/trans.png)
[英]Why can't I create a generic bubbleSort with generator? (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.