Java泛型:包含泛型的数组[重复]
Posted
技术标签:
【中文标题】Java泛型:包含泛型的数组[重复]【英文标题】:Java Generics: Array containing generics [duplicate] 【发布时间】:2011-12-24 01:33:04 【问题描述】:可能重复:Java how to: Generic Array creationError generic array creation
我的任务是用 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 中?
【问题讨论】:
看看***.com/questions/3903196/…对你有没有帮助 认为类型擦除是实现泛型的好方法的另一个原因应该被枪杀。 如果这是家庭作业,请注明。 @DavidZaslavsky,看来我们已经决定使用您发布链接的问题中提出的解决方案,使用 ArrayList 作为集合。非常感谢,我需要提高我的搜索技能。 我无法相信这不是家庭作业。 【参考方案1】:这并不理想,但您可以这样做:
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);
【讨论】:
Class
-> Class<T>
并且不要捕获和丢弃Exception e
。为什么不直接将LinkedList.class
传递给newInstance
?您根本不需要 forName
查找。
Array.newInstance(LinkedList.class, size)
与 new LinkedList[size]
完全相同【参考方案2】:
这对我有用:
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));
是的,构造函数生成了一个警告(解释了“未检查”注释),但之后代码可以正常工作而没有更多警告。
【讨论】:
【参考方案3】:只需使用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);
【讨论】:
以上是关于Java泛型:包含泛型的数组[重复]的主要内容,如果未能解决你的问题,请参考以下文章