创建访问单个特定类型的通用数组

时间:2013-01-27 09:47:55

标签: java arrays generics casting arraylist

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

我尝试使用toArray方法并转换:

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

但这不起作用。我的另一个选择是创建一个MyGeneric<TheType>数组,并逐个插入arraylist的元素,将它们转换为正确的类型。 但我尝试创建此阵列的所有内容都失败了。

我知道我必须使用Array.newInstance(theClass, theSize)但是如何获得MyGeneric<TheType>的课程?使用这个:

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

不起作用。 IDE指出Class<MyGeneric<TheType>>Class<? extends MyGeneric>是不兼容的类型。

这样做:

    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;

ClassCastException行提出data[i] = ...

我该怎么办?

注意:

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

1 个答案:

答案 0 :(得分:3)

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

<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.