【问题标题】:Cast to generic type causing ArrayStoreException in Java转换为泛型类型导致 Java 中的 ArrayStoreException
【发布时间】:2020-09-29 06:39:34
【问题描述】:

我正在创建一个包含类型为Object[] 的实例变量名为array 的类。此类包含一个返回T[] 的方法,其中T 是一个泛型。该方法应该将array 的内容复制到要返回的数组中。相关代码如下所示:

@SuppressWarnings("unchecked")
T[] arr = (T[])Array.newInstance(a.getClass(), array.length);
for (int i = 0; i < array.length; i++) {
    @SuppressWarnings("unchecked")
    T temp = (T)array[i];
    arr[i] = temp;
}
return arr;

在上面的 sn-p 中,a 是另一个作为参数传递的数组。

问题是,当我调用该方法时,它会抛出一个ArrayStoreException。我不确定为什么要这样做,因为我将初始值转换为类型T,然后将其存储在类型为T[] 的数组中,因此类型匹配。为什么还是抛出异常?

【问题讨论】:

    标签: java arrays generics casting arraystoreexception


    【解决方案1】:

    使用该代码创建一个T[][],因为a.getClass()Class&lt;T[]&gt;

    你想要的是a.getClass().getComponentType(),这就是实际的Class&lt;T&gt;

    所以:

    @SuppressWarnings("unchecked")
    T[] arr = (T[])Array.newInstance(a.getClass().getComponentType(), array.length);
    for (int i = 0; i < array.length; i++) {
        @SuppressWarnings("unchecked")
        T temp = (T)array[i];
        arr[i] = temp;
    }
    return arr;
    

    或者你可以使用jre方法

    Arrays.copyOf(array, array.length); // creates a new array and copies the content
    

    【讨论】:

      【解决方案2】:

      你需要检查array[i]T的类型之间的关系,因为它们不一定有扩展关系。

      【讨论】:

        猜你喜欢
        • 2013-05-14
        • 1970-01-01
        • 1970-01-01
        • 2021-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-27
        • 1970-01-01
        相关资源
        最近更新 更多