这个答案来得有些晚,但希望能对未来访问者有所帮助。我对反射解决方案的看法可以改进,但基本思路如下:
@SuppressWarnings("unchecked")
private static <TArray, TElement> TArray toArray(final Object elements, final Class<TElement> elementType)
{
final int length = java.lang.reflect.Array.getLength(elements);
final Object resultArray = java.lang.reflect.Array.newInstance(elementType, length);
for (int i = 0; i < length; ++i)
{
final Object value = java.lang.reflect.Array.get(elements, i);
java.lang.reflect.Array.set(resultArray, i, value);
}
return (TArray)resultArray;
}
然后按照以下方式使用:
final Boolean[] booleans = new Boolean[] { true, false, true, true, false };
final boolean[] primitives = toArray(booleans, boolean.class);
System.out.println(Arrays.asList(booleans));
for (boolean b : primitives)
{
System.out.print(b);
System.out.print(", ");
}
这会打印出以下内容:
[true, false, true, true, false]
true, false, true, true, false,
这个工具能够帮助我们从 java.sql.Array
中取出数组,因为 java.sql.Array
只提供了一个数组的 Object
。
final int[] ret = new int[wrappedArray.length]; int i=0; for (int w : wrappedArray) ret[i++] = w; return ret;
- Marko TopolnikInteger.class
到int[]
没有自动的方式。您需要为每种类型显式地执行该转换。您还需要调用不同的方法来提取基本值,以适用于每个包装器类型。您要么最终得到慢得可怜、复杂混乱的反射代码,要么得到快速、重复的字面代码。 - Marko Topolnik