6

可能重复:
Java 如何:创建通用数组
错误:创建通用数组

我收到此错误:

Cannot create a generic array of T

这是我的代码(第 6 行错误):

1    public class HashTable<T> {
2    
3        private T[] array;
4    
5        HashTable(int initSize) {
6            this.array = new T[initSize];
7        }
8    }

我想知道为什么会出现这个错误以及修复它的最佳解决方案。谢谢。

更新:

我调整了我的代码,以便数组改为采用链表,但我收到了一个新错误。

这是我的错误:

Cannot create a generic array of LinkedList<T>

这是我的代码(第六行错误):

1    public class HashTable<T> {
2    
3        private LinkedList<T>[] array;
4    
5        HashTable(int initSize) {
6            this.array = new LinkedList<T>[initSize];
7        }
8    }

这个错误是出于完全相同的原因吗?我只是假设我可以创建通用链表并将它们存储在数组中。

4

3 回答 3

8

是的,不能创建通用数组。我知道的最好的解决方法是改用集合:

private List<T> list;

.......

list = new ArrayList<T>();
于 2012-05-01T13:39:17.797 回答
3

可以通过反射创建泛型数组(尽管需要不安全的强制转换),您只需将类作为参数传递(假设以下方法在定义<T>类型参数的类内部):

@SuppressWarnings("unchecked")
public T[] createArray(Class<T> klass, int size) {
    return (T[]) Array.newInstance(klass, size);
}

例如,在您的情况下:

HashTable<Integer> t = new HashTable<Integer>();
Integer[] intArray = t.createArray(Integer.class, 4);
intArray[0] = 1; intArray[1] = 2;
intArray[2] = 3; intArray[3] = 4;

System.out.println(Arrays.toString(intArray));
> [1, 2, 3, 4]
于 2012-05-01T13:55:17.990 回答
2

您不能创建 T(在 Java 中),但 T[] 在内部与 Object[] 相同。

public class HashTable<T> {

    private T[] array;

    @SuppressWarnings("unchecked")
    HashTable(int initSize) {
        this.array = (T[]) new Object[initSize];
    }
}

(将编译,我检查过)

由于 newacct 的评论,使用 Object[] 并将项目转换为 T 可能会更好。

public class HashTable<T> {

    private Object[] array;

    public HashTable(int initSize) {
        this.array = new Object[initSize];
    }

    public void put(String pKey, T pItem) {
       ...
       array[x] = pItem;
       ....
    }
    public T get(String pKey) {
       ...
       return (T) array[x];
    }
}
于 2012-05-01T16:00:04.510 回答