有一个带有以下签名的方法:
public static String concatAndSeperate(Object seperator, Object... obj)
该方法的目的是将obj中的对象与obj的条目之间的分隔符连接起来。
现在我有一个由于副作用很大而无法修改的int数组。
int[] numbers = new int[] {1, 2, 3, 4, 5, 6, 7};
我想将这些数字用于SQL IN语句:
SELECT * FROM quux WHERE id IN (1, 2, 3, 4, 5, 6, 7);
所以我试着用我漂亮的小方法来结束它:
concatAndSeperate(", ", numbers);
当然,这不起作用,因为数字是整数数组而不是整数数组。所以我尝试用它制作一个Integer数组:
concatAndSeperate(", ", Arrays.asList(numbers).toArray(new Integer[numbers.length]);
这会导致一个我不明白的错误:
Exception in thread "main" java.lang.ArrayStoreException
at java.lang.System.arraycopy(Native Method)
at java.util.Arrays.copyOf(Unknown Source)
at java.util.Arrays$ArrayList.toArray(Unknown Source)
at mystuff.MyClass.main(MyClass.java:415)
答案 0 :(得分:1)
你可以使用commons-lang来完成将原语转换为包装数组的工作(参见ArrayUtils.toObject(int[]):
concatAndSeparate(", ", ArrayUtils.toObject(numbers));
但是,有没有理由不将数字存储为
Integer numbers = new Integer[] { 1, 2, 3, 4, 5, 6 };
答案 1 :(得分:0)
ArrayStoreException,告诉您yuo尝试将无效类型添加到数组中。
Arrays.asList(T... a)的问题,从其参数创建列表。
你的问题是泛型不适用于基本类型。
当你传递int数组时,泛型vararray会将类型识别为int数组,并将在输出List<int[]>
上创建单个项目。
要“修复”它,只需将基本数组更改为对象
Integer[] numbers = new Integer[] {1, 2, 3, 4, 5, 6, 7};
答案 2 :(得分:0)
根据API Arrays.asList(T ... a)返回由指定数组支持的固定大小的列表。那就是Arrays.asList(numbers)创建一个int []元素的内部数组,长度为1,并将int []复制为一个元素
List<int[]> list = Arrays.asList(numbers);
然后list.toArray()创建Integer []数组,然后尝试将int []数组作为一个Object复制到Integer数组元素0,这会导致ArrayStoreException
BTW你可以这样得到所需的结果
String sql = "SELECT * FROM quux WHERE id IN " + Arrays.toString(numbers).replace('[', '(').replace(']', ')');