Java Generics: Array containing generics
本问题已经有最佳答案,请猛点这里访问。
Possible Duplicate:
Java how to: Generic Array creation
Error generic array creation
我已被委派编写Java中的哈希表,它必须与任何数据类型一起工作。我写的代码规则如下:-哈希表必须有一个数组作为基础数据结构,其大小在构造对象时确定。-当发生冲突时,冲突的元素应该被放置到一个链表中,链表将该索引(键)中的所有元素保存在哈希表中。
因此,对于底层数据类型,我已经制作了一个类型为LinkedList的数组(自定义,而不是Java API链接表)。
1 | private LinkedList<T>[] table; |
当然,问题是实例化这个数组。以下是我的一些尝试:
1 2 3 | public HashTable(int size) { table = new LinkedList<T>[size]; } |
这将引发编译时一般数组创建错误。
1 2 3 |
这会导致运行时出现
项目负责人也不确定如何处理这个问题。是否有任何方法可以更改我的代码,使哈希表仍然有一个数组作为其基础数据结构,而冲突被放置在LinkedList中?
这对我很有用:
1 2 3 4 5 6 7 8 9 10 | public class HashTable<T> { private LinkedList<T> table[]; @SuppressWarnings("unchecked") public HashTable(int size) { table = new LinkedList[size]; } } |
例如:
1 2 3 4 | 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)); |
是的,构造函数生成了一个警告(解释了"unchecked"注释),但是之后代码在没有更多警告的情况下工作。
只需使用
对于它的价值,这是在Java中创建通用数组的方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 | @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); } |
这并不理想,但你可以这样做:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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); } } |