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)
代码看似合理并且编译成功,但不起作用并在运行时抛出异常.你能解释为什么这段代码不起作用吗?我错过了什么?
这个问题与varargs没有任何关系.
正如错误消息所示:您的方法创建并返回一个Object[],并且您将其转换为String[].但是一个Object[]不是String[].因此例外.
查看Collection(及其T[] toArray()方法)的源代码,了解它基本上可以做你想做的事情:创建一个类型的数组T[].
| 归档时间: |
|
| 查看次数: |
326 次 |
| 最近记录: |