Java Generics:包含generics的数组

可能重复:
Java如何:通用arrays创建
错误通用数组创建

我的任务是编写Java中的哈希表,它必须适用于任何数据类型。 我写的代码规则如下: – 哈希表必须有一个数组作为底层数据结构,其大小在构造对象时确定 – 当发生冲突时,应该放置碰撞的元素到链表中,它包含哈希表中该索引(键)的所有元素

因此,对于底层数据类型,我创建了一个LinkedList类型的数组(自定义,而不是Java API LinkedList)。

private LinkedList[] table; 

当然,问题是实例化这个数组。 以下是我的一些尝试:

 public HashTable(int size) { table = new LinkedList[size]; } 

这会引发编译时generics数组创建错误。

 public HashTable(int size) { table = (LinkedList[])(new Object[size]); } 

这会在运行时导致ClassCastException错误( java.lang.Object无法强制转换为LinkedList )。

项目负责人也不确定如何处理这个问题。 有什么方法可以更改我的代码,以便哈希表仍然有一个数组作为其底层数据结构,并将冲突放在LinkedList中?

这对我有用:

 public class HashTable { private LinkedList table[]; @SuppressWarnings("unchecked") public HashTable(int size) { table = new LinkedList[size]; } } 

例如:

 HashTable t = new HashTable(10); t.table[0] = new LinkedList(); t.table[0].add("test"); System.out.println(t.table[0].get(0)); 

是的,构造函数生成了一个警告(解释了“未经检查”的注释),但之后代码在没有更多警告的情况下工作。

只需使用Object[]作为数据存储,然后手动将其转换为特定类型。 这在建立基础设施方面是可以接受的,其中类型关系可能比平时更难。

对于它的价值,这是在Java中创建通用数组的方法:

 @SafeVarargs static  E[] newArray(int length, E... array) { return Arrays.copyOf(array, length); } //used in your example private LinkedList[] table; public HashTable(int size) { table = newArray(size); } 

这不是理想的,但你可以做这样的事情:

 import java.util.LinkedList; public class Test { static class HashTable { public HashTable(int size) { LinkedList[] table = (LinkedList[])java.lang.reflect.Array.newInstance(LinkedList.class, size); } } public static void main(String[] args) { HashTable table = new HashTable(23); } }