我在创建一些数组时遇到了问题。
这是代码
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我读了甲骨文,发现了这个:
“无法创建参数化类型数组”
我总结了我的快捷语法,{}是问题所在。快捷语法创建具有参数化类型的代码。这是正确的吗?
发布于 2022-01-03 23:59:39
不能在Java中创建泛型数组。数组是可还原的类型,在运行时携带它们的类型信息,而泛型是不可读的,它们的类型信息在编译后由于擦除而被擦除。这是由于在java中实现了类型系统,尽管这会导致一些粗糙的边和角情况,但它简化了代码向泛型的演变。由于泛型类型信息被删除,所以在运行时没有它们,这就是为什么不能在java中创建泛型数组的原因。
有两种解决办法可以避免你所面临的问题。可以创建对象数组并将其转换为所需的泛型类型。
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://stackoverflow.com/questions/70572512
复制相似问题