Java Generics:包含泛型的数组

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
public HashTable(int size) {
  table = (LinkedList<T>[])(new Object[size]);
}

这会导致运行时出现ClassCastException错误(java.lang.Object不能强制转换为LinkedList)。

项目负责人也不确定如何处理这个问题。是否有任何方法可以更改我的代码,使哈希表仍然有一个数组作为其基础数据结构,而冲突被放置在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"注释),但是之后代码在没有更多警告的情况下工作。


只需使用Object[]作为数据存储,并手动将其转换为特定类型。这在构建基础设施方面是可以接受的,因为类型关系可能比通常更难。

对于它的价值,这是在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);
    }
}