Java:使用int数组调用Object vararg方法

时间:2013-07-08 08:44:35

标签: java arrays variadic-functions

有一个带有以下签名的方法:

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)

3 个答案:

答案 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(']', ')');