将泛型集合转换为数组

时间:2015-01-23 21:10:57

标签: java arrays generics casting

我试图在Java中实现一个单独的链式哈希表,我遇到了classcastexception。

所以这就是我所做的:

private LinkedList<Entry<K,V>>[] bucketArray;

这个数组将保存所有将作为链的链表。 HashTable类中还有一个内部类Entry,每个包含一个K通用键和V泛型值。

在表的构造函数中,我实际上初始化了数组:

public HashTable(int capacity, int prime) {
    this.capacity = capacity;
    this.prime = prime;
    bucketArray = (LinkedList<Entry<K, V>>[]) new Object[this.capacity];
}

因此,prime只是用于计算压缩密钥,容量用于数组大小。但是当我运行那个jvm时会抛出classcastexception。

如果我将新的Object更改为new LinkedList [this.capacity],那么我的put方法中有一个nullpointer异常,如下所示:

public void put(K k, V v) {
    int h = hashValue(k);
    bucketArray[h].add(new Entry<K, V>(k, v));
}

为简单起见,hashvalue方法总是返回1.

怎么能正确完成?

1 个答案:

答案 0 :(得分:1)

您似乎正在尝试将Object[]投射到LinkedList[] - 这就是您收到错误的原因。实际上,如果您创建正确的类型,则甚至不需要强制转换:

bucketArray = new LinkedList[this.capacity];

您的NPE是另一个问题 - 您已经分配了bucketArray,但其中的每个项目都是null - 您可能希望对{{{{}}进行空检查1}}并在尝试向其添加条目之前将其分配给bucketArray[h]