Java泛型:包含泛型的数组



可能重复:
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);
    }
}

相关内容

  • 没有找到相关文章

最新更新