2

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

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);

当然,这不起作用,因为 numbers 是整数数组而不是整数数组。所以我尝试用它制作一个整数数组:

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)
4

3 回答 3

1

您可以使用 commons-lang 为您完成将原语转换为包装器数组的工作(请参阅ArrayUtils.toObject(int[])

concatAndSeparate(", ", ArrayUtils.toObject(numbers));

但是,您是否有理由不只是将数字存储为

Integer numbers = new Integer[] { 1, 2, 3, 4, 5, 6 };
于 2013-07-08T09:32:52.967 回答
0

根据 API Arrays.asList(T... a) 返回由指定数组支持的固定大小列表。那就是 Arrays.asList(numbers) 创建一个长度为 1 的 int[] 元素的内部数组,并将 int[] 复制为其中的一个元素

List<int[]> list =  Arrays.asList(numbers);

然后 list.toArray() 创建 Integer[] 数组,然后尝试将 int[] 数组作为一个 Object 复制到 Integer 数组元素 0,这会导致 ArrayStoreException

顺便说一句,您可以通过这种方式获得所需的结果

String sql = "SELECT * FROM quux WHERE id IN " + Arrays.toString(numbers).replace('[', '(').replace(']', ')');
于 2013-07-08T09:08:47.017 回答
0

ArrayStoreException告诉你你试图将无效类型放入数组。

Arrays.asList(T... a)的问题是从其参数创建一个列表。

您的问题是泛型不适用于原始类型。

当您传递 int 数组时,通用 vararray 会将类型识别为 int 数组,并将在 output 上创建单个项目List<int[]>

要“修复”它,只需将原始数组更改为对象

Integer[] numbers = new Integer[] {1, 2, 3, 4, 5, 6, 7};

于 2013-07-08T08:50:34.407 回答