将泛型列表转换为数组

2022-08-31 12:53:00

我已经搜索了这个,但不幸的是,我没有得到正确的答案。

class Helper {
    public static <T> T[] toArray(List<T> list) {
        T[] array = (T[]) new Object[list.size()];
        for (int i = 0; i < list.size(); i++) {
            array[i] = list.get(i);
        }
        return array;
    }
}

测试它:

public static void main(String[] args) {
    List<String> list = new ArrayList<String>();
    list.add("abc");
    String[] array = toArray(list);
    System.out.println(array);
}

但是抛出了一个错误:

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
at test.Helper.main(Helper.java:30)

如何解决这个问题?


更新

我想要这种方法,因为有时,我的代码中的类型太长:

newEntries.toArray(new IClasspathEntry[0])

我希望打电话给:

toArray(newEntries)

最后

创建这样的方法似乎是不可能的,非常感谢大家!


答案 1

这是由于类型擦除。泛型在编译中被删除,因此将被编译为返回 .Helper.toArrayObject[]

对于这种特殊情况,我建议你使用List.toArray(T[])。

String[] array = list.toArray(new String[list.size()]);

答案 2

你可以只调用list.toArray(T[]数组),而不必担心自己实现它,但正如aiioobe所说,由于类型擦除,你不能创建泛型类型的数组。如果您需要该类型,则需要自己创建一个类型化实例并将其传入。


推荐