我在創建一些陣列時遇到了問題。
這是代碼
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[]>
我用谷歌搜索,發現泛型型別引數陣列不能用 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 檔案并發現了這一點:
“無法創建引數化型別的陣列”
我總結了我的快捷語法,{} 是問題所在。快捷語法創建具有引數化型別的代碼。這個對嗎?
uj5u.com熱心網友回復:
您不能在 Java 中創建泛型陣列。陣列是可具體化的型別,在運行時攜帶它們的型別資訊,而泛型是不可具體化的,并且它們的型別資訊在編譯時間后由于擦除而被擦除。這是由于 java 中型別系統的實作,即使這會導致一些粗糙的邊緣和極端情況,它也可以簡化代碼向泛型的演變。由于泛型型別資訊已被洗掉,因此您在運行時沒有它們,這就是為什么您不能在 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);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/405261.html
標籤:
上一篇:將List<DerivedClass>傳遞給C#中期望List<ParentClass>的方法
下一篇:C#隱式運算子泛型減/加int
