Java泛型错误

Pat*_*ray 6 java generics

可能重复:
Java如何:通用阵列创建
错误:通用阵列创建

我收到此错误:

Cannot create a generic array of T
Run Code Online (Sandbox Code Playgroud)

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

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

我想知道为什么会出现这个错误,并且是修复它的最佳解决方案.谢谢.

更新:

我调整了我的代码,以便数组代替链接列表,但我收到一个新的错误.

这是我的错误:

Cannot create a generic array of LinkedList<T>
Run Code Online (Sandbox Code Playgroud)

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

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    }
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*exR 8

是的,无法创建通用数组.我知道的最佳解决方法是使用集合:

private List<T> list;

.......

list = new ArrayList<T>();
Run Code Online (Sandbox Code Playgroud)

  • 不是没有(ewwwwww)反射. (2认同)

Ósc*_*pez 3

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

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

例如,在你的情况下:

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]
Run Code Online (Sandbox Code Playgroud)

  • 这是一个反射创建的数组,不安全地转换为泛型类型。不确定它是否算作通用数组创建。至少它不适合我。对我来说,重点是运行时没有完整的通用类型信息,因此不可能实例化一个新的 T。 (2认同)