1

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

我尝试使用该toArray方法和铸造:

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

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

我知道我必须使用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在线提出 a data[i] = ...

我该怎么办?

笔记:

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

4

1 回答 1

3

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

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

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

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

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

- - - - - - 例子 - - - - -

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.
于 2013-01-27T09:53:14.817 回答