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); } }