使用Arrays.copyOf复制不同类型的数组时出现问题

She*_*ari 2 java arrays

我正在尝试创建一个几乎将任何东西作为参数的方法,并返回值的连接字符串表示形式和一些分隔符.

public static String getConcatenated(char delim, Object ...names) {
String[] stringArray = Arrays.copyOf(names, names.length, String[].class); //Exception here
return getConcatenated(delim, stringArray);
}
Run Code Online (Sandbox Code Playgroud)

而实际的方法

public static String getConcatenated(char delim, String ... names) {
if(names == null || names.length == 0)
    return "";

StringBuilder sb = new StringBuilder();

for(int i = 0; i < names.length; i++) {
    String n = names[i];
    if(n != null) {
        sb.append(n.trim());
        sb.append(delim);
    }
}

//Remove the last delim
return sb.substring(0, sb.length()-1).toString();
}
Run Code Online (Sandbox Code Playgroud)

我有以下JUnit测试:

final String two = RedpillLinproUtils.getConcatenated(' ', "Shervin", "Asgari");
Assert.assertEquals("Result", "Shervin Asgari", two); //OK

final String three = RedpillLinproUtils.getConcatenated(';', "Shervin", "Asgari");
Assert.assertEquals("Result", "Shervin;Asgari", three); //OK

final String four = RedpillLinproUtils.getConcatenated(';', "Shervin", null, "Asgari", null);
Assert.assertEquals("Result", "Shervin;Asgari", four); //OK

final String five = RedpillLinproUtils.getConcatenated('/', 1, 2, null, 3, 4);
Assert.assertEquals("Result", "1/2/3/4", five); //FAIL
Run Code Online (Sandbox Code Playgroud)

但是,测试在最后一部分失败,但有例外:

java.lang.ArrayStoreException at java.lang.System.arraycopy(Native Method) at java.util.Arrays.copyOf(Arrays.java:2763)

有人可以发现错误吗?

aio*_*obe 6

因为你不能存储Integers在一个String[]数组中,所以你无法将一个对象数组复制到一个字符串数组中.你必须以某种方式浏览.toString()每个对象.

这个解决方案可以工作:

public static String concat(char delim, Object... objs) {
    if (objs == null || objs.length == 0) return "";
    StringBuilder sb = new StringBuilder();
    for (Object o : objs)
        sb.append(delim).append(o);
    return sb.substring(1);
}
Run Code Online (Sandbox Code Playgroud)

作为关于varargs的旁注; 我怀疑你是否需要检查objs == null.编译器会将from的调用concat(",", "a", "b", "c")转换为concat(",", new Object[] {"a", "b", "c"),因此我看不出怎么objs会相等null.- >