创建类的通用类型的数组

时间:2019-12-29 14:20:44

标签: java generics casting runtime-error

对于类,我们必须在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);
  }
}

第二种情况下该怎么办?

2 个答案:

答案 0 :(得分:2)

您正尝试将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);
    }
}

答案 1 :(得分:0)

尝试一下:

TaskStackBuilder

您可以进一步参考here