可能重复:
Java如何:创建泛型数组
创建一般数组时出错
我的任务是用Java编写哈希表,它必须适用于任何数据类型。我正在编写的代码规则如下:-哈希表必须有一个数组作为底层数据结构,其大小在构造对象时确定-当发生冲突时,应该将发生冲突的元素放入链表中,该链表包含哈希表中该索引(键(处的所有元素
因此,对于底层数据类型,我制作了一个类型为LinkedList(自定义,而不是Java API LinkedList(的数组。
private LinkedList<T>[] table;
当然,问题是实例化这个数组。以下是我的一些尝试:
public HashTable(int size) {
table = new LinkedList<T>[size];
}
这会引发编译时通用数组创建错误。
public HashTable(int size) {
table = (LinkedList<T>[])(new Object[size]);
}
这会在运行时导致ClassCastException
错误(java.lang.Object
无法转换为LinkedList
(。
项目负责人也不确定如何处理这个问题。有没有什么方法可以更改我的代码,使哈希表仍然有一个数组作为其底层数据结构,并将冲突放在LinkedList中?
这对我有效:
public class HashTable<T> {
private LinkedList<T> table[];
@SuppressWarnings("unchecked")
public HashTable(int size) {
table = new LinkedList[size];
}
}
例如:
HashTable<String> t = new HashTable<String>(10);
t.table[0] = new LinkedList<String>();
t.table[0].add("test");
System.out.println(t.table[0].get(0));
是的,构造函数生成了一个警告(解释了"未检查"的注释(,但之后代码就可以工作了,没有更多的警告。
只需使用Object[]
作为数据存储,并手动将其强制转换为特定类型。这在构建基础设施方面是可以接受的,因为类型关系可能比平时更难。
值得一提的是,这是在Java中创建通用数组的方法:
@SafeVarargs
static <E> E[] newArray(int length, E... array)
{
return Arrays.copyOf(array, length);
}
//used in your example
private LinkedList<T>[] table;
public HashTable(int size) {
table = newArray(size);
}
这并不理想,但你可以做这样的事情:
import java.util.LinkedList;
public class Test
{
static class HashTable<T>
{
public HashTable(int size)
{
LinkedList<T>[] table = (LinkedList<T>[])java.lang.reflect.Array.newInstance(LinkedList.class, size);
}
}
public static void main(String[] args)
{
HashTable<Integer> table = new HashTable<Integer>(23);
}
}