发布于 2010-06-07 19:53:41
简单的答案是:不要将数组与泛型混合在一起!
使用哈希集列表:
ArrayList<HashSet<Integer>> rows = new ArrayList<HashSet<Integer>>();这里的问题是Java规范不允许声明泛型对象数组。
解决方法之一是使用通配符,但您将失去类型安全性:
HashSet<?>[] rows = new HashSet<?>[9];
for (int i = 0; i < rows.length; ++i)
rows[i] = new HashSet<Integer>();在您的示例中,当您要检查某个项是否包含时,这不会造成问题:您可以轻松地执行rows[0].contains(4),但是当添加新内容时,您将被迫将该行强制转换为正确的类型,并抑制未选中的强制转换本身的警告:
((HashSet<Integer>)rows[0]).add(4);附带注意:如果您觉得先锋只是下载珍藏框架,该框架具有一个非泛型的、高度优化的整数散列集版本,用于处理原始类型,那么我要讨论的是TIntHashSet类:它将解决您的问题,并最终得到更快的代码。
发布于 2010-06-07 20:02:35
引用约书亚·布洛赫的有效Java第二版,第119页
由于这些基本差异,数组和泛型不能很好地混合在一起。例如,创建泛型类型、参数化类型或类型参数的数组是非法的。这些数组创建表达式都不是合法的:
new List<E>[], new List<String>[], new E[]。所有这些都会在编译时导致泛型数组创建错误。 为什么创建泛型数组是非法的?因为它不是打字机。如果它是合法的,编译器在其他正确的程序中生成的转换可能会在运行时与ClassCastException一起失败。这将违反通用类型系统提供的基本保证。
(我省略了解释泛型类型擦除的部分)
这本书的概论章节是可作为PDF提供。
发布于 2010-06-07 19:55:34
可以在类型声明中声明泛型,但不能在实际分配对象时声明泛型。不确定确切的原因,也许是为了强化这样的概念,即某些泛型信息在编译时不被保存。
Set<Integer> rows[] = new HashSet[3];
for (int i = 0; i < rows.length; i++) {
rows[i] = new HashSet<Integer>();
}https://stackoverflow.com/questions/2992615
复制相似问题