Java 泛型数组( T[] arr = new T[N])创建报错之谜!

今天小编在创建一个泛型数组的时候报了错。
代码如下:

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 泛型数组( T[] arr = new T[N])创建报错之谜!_第1张图片

原因

原因在于 Java中的泛型擦除

1、Java泛型是使用擦除来实现的,这意味着在使用泛型的时候任何具体的类型信息都被擦除,唯一知道的就是在使用一个对象。
2、任何在运行时需要确切知道类型信息的操作都将无法工作。

这就不难理解了 new T[N]T[] arr进行赋值时,意味着T[] arr要知道 new T[N]的数据类型。但是在运行时被擦除,,所以报错。

解决方案

  1. 方案一
    一般的解决方案:在想要创建泛型数组的地方使用ArrayList
    private List<T> list = new ArrayList<>();
    
  2. 方案二
    成功创建泛型数组的唯一方式就是创建一个被擦除类型的新数组,然后对其转型。
    private T[] list;
    private int size;
    
    public ArrayLinkedStack(int capacity) {
       list = (T[]) new Object[capacity];
    
    }
    

你可能感兴趣的:(Java)