首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我不能用Java创建泛型数组?

为什么我不能用Java创建泛型数组?
EN

Stack Overflow用户
提问于 2022-01-03 23:26:24
回答 1查看 544关注 0票数 2

我在创建一些数组时遇到了问题。

这是代码

代码语言:javascript
复制
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 (也许是编译器?)说:

代码语言:javascript
复制
Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    Cannot create a generic array of Predicate<Integer[]>

我搜索了一下,发现泛型类型参数数组不能用Java制作。

我读过关于编译时间和运行时的文章,我认为这可能不是我的问题。

我看到了一些编译的代码:

代码语言:javascript
复制
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

我读了甲骨文,发现了这个:

“无法创建参数化类型数组”

我总结了我的快捷语法,{}是问题所在。快捷语法创建具有参数化类型的代码。这是正确的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-03 23:59:39

不能在Java中创建泛型数组。数组是可还原的类型,在运行时携带它们的类型信息,而泛型是不可读的,它们的类型信息在编译后由于擦除而被擦除。这是由于在java中实现了类型系统,尽管这会导致一些粗糙的边和角情况,但它简化了代码向泛型的演变。由于泛型类型信息被删除,所以在运行时没有它们,这就是为什么不能在java中创建泛型数组的原因。

有两种解决办法可以避免你所面临的问题。可以创建对象数组并将其转换为所需的泛型类型。

代码语言:javascript
复制
final T[] arr = (T[]) new Object[n]

否则

代码语言:javascript
复制
final Object[] arr = new Object[]

当您从这个数组中获得像这样的项时,您可以执行强制转换

代码语言:javascript
复制
T itm = (T) arr[1];

如果不返回这个内部数组,上述两种方法都可以工作。

但是,如果要返回内部数组,则需要以反射方式创建它,因为您需要维护正确的可还原类型。

代码语言:javascript
复制
static <T> T[] createArr(Class<T> clz) {
    return (T[]) Array.newInstance(clz, 5);
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70572512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档