对于类,我们必须在Java中实现数据结构,而不使用默认情况下已经实现的数据结构,因此不,我不能使用Lists。以前,有些情况下需要创建通用类型T的数组,并且以下工作没有问题:

class Test<T> {
  private T[] array;

  @SuppressWarnings("unchecked")
  public Test(int sz) {
    array = (T[]) new Object[sz];
  }

  public static void main(String[] args) {
    Test test = new Test(1);
  }
}


现在,有必要创建类型为T的数组,而不是类型为Thing<T>的数组,其中Thing是一个类...相同的方法会导致运行时错误(java.lang.ClassCastException):

class Thing<T> { }

class Test<T> {
  private Thing<T>[] array;

  @SuppressWarnings("unchecked")
  public Test(int sz) {
    array = (Thing<T>[]) new Object[sz];
  }

  public static void main(String[] args) {
    Test<Object> test = new Test<>(1);
  }
}


关于第二种情况该怎么办?

最佳答案

您试图将Object的列表强制转换为Thing而不是Object的列表,因此它将不起作用。

您面临的问题是in Java you can't instantiate an array of generic types

因此,而是创建一个原始类型Thing[]的数组并将其强制转换为通用类型Thing<T>[],在这种情况下,考虑到type erasure仍在发生,这是可以的。

class Thing<T> {
}

class Test<T> {
    private Thing<T>[] array;

    @SuppressWarnings("unchecked")
    public Test(int sz) {
        array = (Thing<T>[]) new Thing[sz];
    }

    public static void main(String[] args) {
        Test<Object> test = new Test<>(1);
    }
}

09-10 06:51
查看更多