在Java中可以使用数组varargs吗?

nta*_*lbs 1 java variadic-functions

我试图实现一个方法来合并任意数量的数组.

@SuppressWarnings("unchecked")
public static <T> T[] merge(T[]... arrs) {
    int length = 0;
    for (T[] arr : arrs) {
        length += arr.length;
    }

    T[] merged = (T[]) new Object[length];
    int destPos = 0;
    for (T[] arr : arrs) {
        System.arraycopy(arr, 0, merged, destPos, arr.length);
        destPos += arr.length;
    }
    return merged;
}
Run Code Online (Sandbox Code Playgroud)

它编译,看起来没有问题.然后我测试了这个方法:

    String[] a = {"a", "b", "c"};
    String[] b = {"e", "f"};
    String[] c = {"g", "h", "i"};

    String[] m = merge(a,b,c);
Run Code Online (Sandbox Code Playgroud)

虽然此代码已成功编译,但它会引发异常:

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
    at ntalbs.test.ArrayMerge.main(ArrayMerge.java:25)
Run Code Online (Sandbox Code Playgroud)

代码看似合理并且编译成功,但不起作用并在运行时抛出异常.你能解释为什么这段代码不起作用吗?我错过了什么?

JB *_*zet 5

这个问题与varargs没有任何关系.

正如错误消息所示:您的方法创建并返回一个Object[],并且您将其转换为String[].但是一个Object[]不是String[].因此例外.

查看Collection(及其T[] toArray()方法)的源代码,了解它基本上可以做你想做的事情:创建一个类型的数组T[].