【问题标题】:Create a generic array accesing a single particular type创建访问单个特定类型的通用数组
【发布时间】:2013-01-10 20:32:06
【问题描述】:

我想将泛型类型的ArrayList 转换为泛型类型数组(相同的泛型类型)。例如,我有ArrayList<MyGeneric<TheType>>,我想获得MyGeneric<TheType>[]

我尝试使用toArray 方法和强制转换:

(MyGeneric<TheType>[]) theArrayList.toArray()

但这不起作用。我的另一个选择是创建一个MyGeneric&lt;TheType&gt; 的数组并一个接一个地插入arraylist 的元素,将它们转换为正确的类型。 但是我试图创建这个数组的一切都失败了。

我知道我必须使用Array.newInstance(theClass, theSize),但我如何获得MyGeneric&lt;TheType&gt; 的类?使用这个:

Class<MyGeneric<TheType>> test = (new MyGeneric<TheType>()).getClass();

不起作用。 IDE 声明 Class&lt;MyGeneric&lt;TheType&gt;&gt;Class&lt;? extends MyGeneric&gt; 是不兼容的类型。

这样做:

    Class<? extends MyGeneric> test = (new MyGeneric<TheType>()).getClass();

    MyGeneric[] data = (MyGeneric[]) Array.newInstance(test, theSize);

    for (int i=0; i < theSize; i++) {
        data[i] = theArrayList.get(i);
    }
    return data;

data[i] = ... 行引发ClassCastException

我该怎么办?

注意:

我需要该数组,因为我必须将它与第三方库一起使用,因此“在此处使用 insert-the-name-of-the-collection-here”不是一个选项。

【问题讨论】:

    标签: java arrays generics casting arraylist


    【解决方案1】:

    先创建一个你的类型的数组,然后你应该调用:

    <T> T[]   toArray(T[] a)
    

    以正确的方式返回包含此列表中所有元素的数组 序列(从第一个到最后一个元素);的运行时类型 返回的数组是指定数组的数组。

    阅读规范: http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#toArray(T[])

    如果您的数组比列表短,则该方法将分配并返回一个新数组;如果您的数组比列表长,则数组中的其余项将设置为 null。

    ----------- 示例 ----------

    ArrayList<MyGeneric<TheType>> list;
    //......
    MyGeneric<TheType>[] returnedArray = new MyGeneric[list.size()]; // You can't create a generic array. A warning for an error. Don't mind, you can suppress it or just ignore it.
    returnedArray = list.toArray(returnedArray); // Cong! You got the MyGeneric<TheType>[] array with all the elements in the list.
    

    【讨论】:

    • “先创建一个你的类型的数组”是什么意思?假设我有ArrayList&lt;MyGeneric&lt;TheType&gt;&gt; T 应该是TheType 还是MyGeneric?你能举个例子吗,因为我不明白那个方法是怎么工作的。
    • @Bakuriu T 应该是 MyGeneric
    • 你也可以使用new MyGeneric&lt;?&gt;[list.size()] 来避免使用原始类型
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多