首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建集合的数组?

如何创建集合的数组?
EN

Stack Overflow用户
提问于 2010-06-07 19:51:19
回答 4查看 31.7K关注 0票数 23

可能重复: 为什么我不能在Java中创建泛型数组类型?

代码语言:javascript
复制
HashSet<Integer>[] rows = new HashSet<Integer>[9];

给出一个编译错误:泛型数组创建。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-06-07 19:53:41

简单的答案是:不要将数组与泛型混合在一起!

使用哈希集列表:

代码语言:javascript
复制
ArrayList<HashSet<Integer>> rows = new ArrayList<HashSet<Integer>>();

这里的问题是Java规范不允许声明泛型对象数组。

解决方法之一是使用通配符,但您将失去类型安全性:

代码语言:javascript
复制
HashSet<?>[] rows = new HashSet<?>[9];

for (int i = 0; i < rows.length; ++i)
    rows[i] = new HashSet<Integer>();

在您的示例中,当您要检查某个项是否包含时,这不会造成问题:您可以轻松地执行rows[0].contains(4),但是当添加新内容时,您将被迫将该行强制转换为正确的类型,并抑制未选中的强制转换本身的警告:

代码语言:javascript
复制
((HashSet<Integer>)rows[0]).add(4);

附带注意:如果您觉得先锋只是下载珍藏框架,该框架具有一个非泛型的、高度优化的整数散列集版本,用于处理原始类型,那么我要讨论的是TIntHashSet类:它将解决您的问题,并最终得到更快的代码。

票数 29
EN

Stack Overflow用户

发布于 2010-06-07 20:02:35

引用约书亚·布洛赫的有效Java第二版,第119页

由于这些基本差异,数组和泛型不能很好地混合在一起。例如,创建泛型类型、参数化类型或类型参数的数组是非法的。这些数组创建表达式都不是合法的:new List<E>[], new List<String>[], new E[]。所有这些都会在编译时导致泛型数组创建错误。 为什么创建泛型数组是非法的?因为它不是打字机。如果它是合法的,编译器在其他正确的程序中生成的转换可能会在运行时与ClassCastException一起失败。这将违反通用类型系统提供的基本保证。

(我省略了解释泛型类型擦除的部分)

这本书的概论章节是可作为PDF提供

票数 7
EN

Stack Overflow用户

发布于 2010-06-07 19:55:34

可以在类型声明中声明泛型,但不能在实际分配对象时声明泛型。不确定确切的原因,也许是为了强化这样的概念,即某些泛型信息在编译时不被保存。

代码语言:javascript
复制
Set<Integer> rows[] = new HashSet[3];
for (int i = 0; i < rows.length; i++) {
 rows[i] = new HashSet<Integer>();
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2992615

复制
相关文章

相似问题

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