今天小编在创建一个泛型数组的时候报了错。
代码如下:
class Stack<T> {
private T[] list;
private int n;
private Stack(int capacity) {
list = new T[capacity];
}
}
报错信息如下:
Error:(15, 17) java: 创建泛型数组
从上面的错误信息可以推断出来Java不支持直接创建 T[] arr = new T[N]
形式的泛型数组。
问题出在哪里?这个明明在逻辑上可以行得通的。
原因
原因在于 Java中的泛型擦除
1、Java泛型是使用擦除来实现的,这意味着在使用泛型的时候任何具体的类型信息都被擦除,唯一知道的就是在使用一个对象。
2、任何在运行时需要确切知道类型信息的操作都将无法工作。
这就不难理解了 new T[N]
对 T[] arr
进行赋值时,意味着T[] arr
要知道 new T[N]
的数据类型。但是在运行时被擦除,,所以报错。
解决方案
- 方案一
一般的解决方案:在想要创建泛型数组的地方使用ArrayList
private List<T> list = new ArrayList<>();
- 方案二
成功创建泛型数组的唯一方式就是创建一个被擦除类型的新数组,然后对其转型。private T[] list; private int size; public ArrayLinkedStack(int capacity) { list = (T[]) new Object[capacity]; }