java - 创建类的泛型类型数组

标签 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);
  }
}

对于第二种情况可以做什么?

最佳答案

您正在尝试转换 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);
    }
}

关于java - 创建类的泛型类型数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59520199/

相关文章:

java - XSL - 匹配节点的文本并附加另一个节点作为同级节点

java - Hibernate 发出个人查询而不是加入

C# 泛型,状态模式的交叉引用类

c# - 为什么这个泛型函数不调用重写函数

Java 对象列出优点和缺点

Java:有没有办法在使用 post 上传文件时计算下载吞吐量(在特定时间间隔内)?

java - 如何为对象 2 的变量赋予与对象 1 中的变量相同的值?

c# - 调用方法匿名类

parameters - 类型转换为自定义对象 - 数据丢失吗?

Haskell 类型转换问题